CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

关于java中String用==比较的问题

楼主learnerkk(可可)2004-05-02 19:49:19 在 Java / J2SE / 基础类 提问

比如:String   s1=="dd";  
              String   s2=="dd";  
              System.out.println(s1==s2);//true  
              String   s1=new   Integer(1).toString();  
              String   s2="1";  
              System.out.println(s1==s2);//true  
              String   s1=new   Integer(12).toString();  
              String   s2="12";  
              System.out.println(s1==s2);//false 问题点数:20、回复次数:24Top

1 楼learnerkk(可可)回复于 2004-05-02 19:50:25 得分 0

why?Top

2 楼vongood((my c++))回复于 2004-05-02 20:14:08 得分 0

关注,不知为什么,小于11的都是true.Top

3 楼dfsdf36(dfsdf36)回复于 2004-05-02 20:17:50 得分 0

用“==”仅仅是比较引用是否相同,一般没什么意思。用int   compareTo(String   anotherString)才是比较值  
  例如   System.out.println("12".compareTo(new   Integer(12).toString())==0);//true  
  至于上面的s1==s2有时true时false,原因应该在与编译器有时智能的把两个值相同string指向同一引用。Top

4 楼zsubear(熊)回复于 2004-05-02 22:49:28 得分 0

java中的String有值不变性,所以编译器会把String设为共享  
  但有些情况编译器无法分辨两个String是否应当共享  
  最常见的是+和substring返回的StringTop

5 楼dlxu(脱离纯粹Coding阶段)回复于 2004-05-02 23:00:26 得分 0

判断两个STRING是否相等要用equals方法Top

6 楼ai92(blog.csdn.net/ai92)回复于 2004-05-02 23:18:18 得分 0

markTop

7 楼realwf(洪都拉斯)回复于 2004-05-02 23:43:37 得分 0

比较两个Object(不含基本类型),当用==时,是比较引用是否相同,要用equals方法才可以比较值(但必须是标准程序库中的类,自己写的类要覆写equals方法)。  
   
  JAVA为了节约内存,相同内容的String(名字不同)其实可能会指向同一块内存(同一个引用),不太占空间的可能指向不同的引用(如1字节),所以有时比较引用会相同,但比较值时尽量还是应该用equals方法  
  Top

8 楼fishstudio(仓廪实,而知礼节)回复于 2004-05-03 00:43:17 得分 0

其实很简单,“==”这个操作符仅仅是判断这两个String是不是同一个东西  
   
  判断两个STRING是否相等要用equals方法,也就是说equals是看看String的内容  
   
  你只要这样比较,肯定有区别的!  
   
  至于   String   s1=new   Integer(12).toString();里面的内容  
   
  建议你还是首先输出以下,看看,应该不是你想象的内容Top

9 楼haoqingshi(飞翔)回复于 2004-05-03 04:39:06 得分 0

楼主,我先纠正一下你的错误,我在我的机器上都试过了(jdk1.4):  
              String   s1=new   Integer(1).toString();  
              String   s2="1";  
              System.out.println(s1==s2);//false  
              String   s1=new   Integer(12).toString();  
              String   s2="12";  
              System.out.println(s1==s2);//false  
   
  “==”操作符表示的是两个对象引用是否相同(也就说对象值的首内存地址)。  
  很明显这里new   Integer(1)是生成的新的对象,所以它跟s2不可能是指向同一个内存地址,也就是常说的引用。  
  对于基本类型(int,char,……)以及字符串类型(String,StringBuffer),同时没有生成新的对象的情况下),JAVA为了节约内存,相同内容(名字不同)其实可能会指向同一块内存(同一个引用)Top

10 楼learnerkk(可可)回复于 2004-05-03 10:23:45 得分 0

首先,感谢大家的回答!^^  
   
  其次,提醒一下楼上的,我们的QQ讨论组里的人试出来都是大于10的integer是false,而且三楼的vongood((my   c++))也说了“关注,不知为什么,小于11的都是true”可见你的“纠正”有些问题,看来其中还是有些什么玄机。  
   
  最后,我是SCJP,我不是要炫耀,只是有些类似“==是比较对象引用是否相同”和“数值和字符串应该如何进行内容比较才正确”的回答就不必了,我的本意不是想知道怎么比较才正确,而是要知道个为什么!为什么JavaVM是这样处理的呢?望高手指教!Top

11 楼jkit(不再灌水)回复于 2004-05-03 10:51:12 得分 0

请楼主说一下你的环境。  
   
  我是对这句话:“关注,不知为什么,小于11的都是true”绝对奇怪,在WinXP,JDK1.4.1_02环境下测试的,结果很正常,正如先前所料,是false!    
   
  测试代码如下:  
                  String   a1   =   "1";  
                  String   n1   =   new   Integer(1).toString();  
                  System.out.println(a1   ==   n1);  
  结果:falseTop

12 楼marvy(marvy)回复于 2004-05-03 12:51:21 得分 0

up!Top

13 楼yoyodd(蓝梦丁丁)回复于 2004-05-03 13:26:04 得分 0

看来我不用说什么了,楼上的说得很清楚了Top

14 楼marvy(marvy)回复于 2004-05-03 13:33:54 得分 10

public   class   TestString  
  {  
    public   TestString(){  
      String   s1   =   "dd";  
      String   s2   =   "dd";  
      System.out.println(s1==s2);//true  
      System.out.println(s1.equals(s2));//true  
   
      System.out.println("-------------------");  
   
      String   s3   =   new   Integer(1).toString();  
      String   s4   =   "1";  
      System.out.println(s3==s4);//true  
      System.out.println(s3.equals(s4));//true  
   
      System.out.println("-------------------");  
   
      String   s5   =   new   Integer(11).toString();  
      String   s6   =   "11";  
      System.out.println(s5==s6);//false  
      System.out.println(s5.equals(s6));//true  
    }  
   
    public   static   void   main(String[]   args){  
      new   TestString();  
    }  
   
  }Top

15 楼marvy(marvy)回复于 2004-05-03 13:34:30 得分 0

楼主很心细:~)  
   
  正在思考中   ...Top

16 楼marvy(marvy)回复于 2004-05-03 14:03:18 得分 0

看了一下源码,....new   Integer(1).toString()....最终调用的是Integer类中的toString(int   i)方法,此方法的实现是如下:  
  -------------------------------------------------------------------------------  
  public   static   String   toString(int   i)   {  
                  switch(i)   {  
                          case   Integer.MIN_VALUE:   return   "-2147483648";  
                          case   -3:   return   "-3";  
                          case   -2:   return   "-2";  
                          case   -1:   return   "-1";  
                          case   0:   return   "0";  
                          case   1:   return   "1";  
                          case   2:   return   "2";  
                          case   3:   return   "3";  
                          case   4:   return   "4";  
                          case   5:   return   "5";  
                          case   6:   return   "6";  
                          case   7:   return   "7";  
                          case   8:   return   "8";  
                          case   9:   return   "9";  
                          case   10:   return   "10";  
                  }  
                  char[]   buf   =   (char[])(perThreadBuffer.get());  
                  int   charPos   =   getChars(i,   buf);  
                  return   new   String(buf,   charPos,   12   -   charPos);  
          }  
   
          //   Per-thread   buffer   for   string/stringbuffer   conversion  
          private   static   ThreadLocal   perThreadBuffer   =   new   ThreadLocal()   {  
                  protected   synchronized   Object   initialValue()   {  
                          return   new   char[12];  
                  }  
          };  
   
          private   static   int   getChars(int   i,   char[]   buf)   {  
                  int   q,   r;  
                  int   charPos   =   12;  
                  char   sign   =   0;  
   
                  if   (i   <   0)   {    
                          sign   =   '-';  
                          i   =   -i;  
                  }  
   
                  //   Generate   two   digits   per   iteration  
                  while   (i   >=   65536)   {  
                          q   =   i   /   100;  
                  //   really:   r   =   i   -   (q   *   100);  
                          r   =   i   -   ((q   <<   6)   +   (q   <<   5)   +   (q   <<   2));  
                          i   =   q;  
                          buf   [--charPos]   =   DigitOnes[r];  
                          buf   [--charPos]   =   DigitTens[r];  
                  }  
   
                  //   Fall   thru   to   fast   mode   for   smaller   numbers  
                  //   assert(i   <=   65536,   i);  
                  for   (;;)   {    
                          q   =   (i   *   52429)   >>>   (16+3);  
                          r   =   i   -   ((q   <<   3)   +   (q   <<   1));     //   r   =   i-(q*10)   ...  
                          buf   [--charPos]   =   digits   [r];  
                          i   =   q;  
                          if   (i   ==   0)   break;  
                  }  
                  if   (sign   !=   0)   {  
                          buf   [--charPos]   =   sign;  
                  }  
                  return   charPos;  
          }  
   
  -------------------------------------------------------------------------------  
   
  没有发觉会与整数大于11和小于11有关的地方。  
   
  正在思考...Top

17 楼learnerkk(可可)回复于 2004-05-03 21:25:15 得分 0

谢谢楼上各位的回答,我的环境是xp   professional,j2sdk1.4.2  
  marvy(marvy)能解释一下你的代码吗?谢谢!Top

18 楼marvy(marvy)回复于 2004-05-04 17:54:40 得分 0

呵呵:~)  
  那不是我的代码,是JSDK的源码。我也正在考虑中...Top

19 楼ruangaofeng(高峰)回复于 2004-05-04 19:49:48 得分 0

我测试了楼主的代码:  
  public   class   TestString  
  {  
    public   TestString(){  
      String   s1   =   "dd";  
      String   s2   =   "dd";  
      System.out.println(s1==s2);//true  
      System.out.println(s1.equals(s2));//true  
   
      System.out.println("-------------------");  
   
      String   s3   =   new   Integer(1).toString();  
      String   s4   =   "1";  
      System.out.println(s3==s4);//true  
      System.out.println(s3.equals(s4));//true  
   
      System.out.println("-------------------");  
   
      String   s5   =   new   Integer(11).toString();  
      String   s6   =   "11";  
      System.out.println(s5==s6);//false  
      System.out.println(s5.equals(s6));//true  
    }  
   
    public   static   void   main(String[]   args){  
      new   TestString();  
    }  
   
  }  
  结果是这样的:  
  true  
  true  
  ----------------  
  false  
  true  
  ________________  
  false  
  true  
  你的猜测是没根据的Top

20 楼sportboys(多动男孩)回复于 2004-05-04 20:18:02 得分 0

我也测试了楼主的代码  
    public   TestString(){  
      String   s1   =   "dd";  
      String   s2   =   "dd";  
      System.out.println(s1==s2);//true  
      System.out.println(s1.equals(s2));//true  
   
      System.out.println("-------------------");  
   
      String   s3   =   new   Integer(1).toString();  
      String   s4   =   "1";  
      System.out.println(s3==s4);//true  
      System.out.println(s3.equals(s4));//true  
   
      System.out.println("-------------------");  
   
      String   s5   =   new   Integer(11).toString();  
      String   s6   =   "11";  
      System.out.println(s5==s6);//false  
      System.out.println(s5.equals(s6));//true  
   
  结果是:  
  true  
  true  
  -------------------  
  true  
  true  
  -------------------  
  false  
  true  
   
  真奇怪Top

21 楼sportboys(多动男孩)回复于 2004-05-04 20:39:19 得分 0

弱弱地问learnerkk(可可)  
  SCJP是什么啊Top

22 楼sportboys(多动男孩)回复于 2004-05-04 20:46:06 得分 10

其实我觉得,主要是大家的JSDK版本不同所引起的  
  我刚才还试了  
  String   s3   =   new   Integer(-2147483647).toString();  
  String   s4   =   "-2147483647";  
  System.out.println(s3   ==   s4);   //true  
  System.out.println(s3.equals(s4));   //true  
  这也跟那段JSDK中的代码相吻合了  
   
  所以请大家看看自己的JSDK的代码,应该和那个有关Top

23 楼marvy(marvy)回复于 2004-05-05 16:19:57 得分 0

同意sportboys(多动男孩)   。  
  可能是由于J2SDK的不同版本引起的。Top

24 楼maowu(猫呜)回复于 2004-05-05 16:54:17 得分 0

这是明显的事情,对于java规范没有要求的东西,不同的jdk或者虚拟机都有可能有不同的结果.  
  Top

相关问题

  • java的String类用法
  • string 比较
  • java中String字符串的传递。(引用)
  • 有关java中String类的方法的一个问题,急用!!!
  • JAVA代码中如何调用Domino中的函数,如调用@Password(string)方法?
  • 在java中如何实现String到int型的转换???用什么方法???
  • c# string类的比较
  • 请问大家java用什么工具开发比较好?
  • 用java编写网络程序,那本书比较好?
  • 初写JAVA程序,用什么编译器比较好?

关键词

  • 内存
  • 编译器
  • 内容
  • 引用
  • 相同
  • 指向
  • equals
  • println
  • teststring
  • 同一个

得分解答快速导航

  • 帖主:learnerkk
  • marvy
  • sportboys

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo