问题是这样的:第一个s1,s2是执行时分配的内存空间,两个地址不一样,s1 == s2操作是比较的地址,不象c++中有重载了==操作符,所以返回false
第二个是编译是分配的地址,都指向的同一段常量数据,所以s1 == s2为真如果你要比较两个字符串的内容,请使用String.compare或者String.compareNoCase

解决方案 »

  1.   

    第二个当然是执行时分配的内存空间,但是s1和s2指向的不是同一个内存空间了,所以用==,就false了
      

  2.   

    靠,求大家以后判断字符串用equals()好不好
      

  3.   

    但第二个却是true,你可以运行看,并不是你所说的false了!我也觉的奇怪,如果第二个是这样就是false了
    public class Test2
    {
               String s1=new String("hello");
               String s2=new String("hello");
               System.out.println(s1==s2);
    }
    而且我试了一下,在后头改了s1="fffff";System.out.println(s2);s2还是hello,没有变
    按道理说,s1跟s2应该是申请的两个空间,可为什么s1==s2,却是true?
    我也不清楚是怎么搞的?
      

  4.   

    这就是==和equals的区别,要有好的编成习惯,用equals试试
      

  5.   

    to:lewiha(神仙李) ( ) 
    String是类不是基本类型这是对的。但String在JAVA中是一种比较特殊的类。在大多数应用中,以上的两种定义没有区别,但当比较时就有区别了,也是一种比较特殊的情况。  
    因为==对类是比较引用(地址)而,String类的equals()方法是比较内容了。  
    第一种定义时当第一次出现“hello”JAVA会在内存中建立一个常量地址,第二次出现时就直接使用了,所以第一种定义时,用a1==a2比较为true,用a1.equals(a2)比较也为true。  
    而第二种定义就不同了,JAVA会每次新建立一块内存区域并把内存首址返回给句柄,所以用==比较返回false,而用equals()比较会返回true。  
      

  6.   

    to: sun_en(jackeylove)  
    这不是在研究编成习惯
    请你搞清楚再回答
      

  7.   

    System.out.println(s1.equals(s2));
    打印:true
    ----------------------------------------
    String  s1="hello" 
    String  s2="hello";  
    这里java为我们做了一个特殊的处理----指向了同一地址。。
      

  8.   

    请大家先看清楚我的问题
    至于==和equals的问题我想大家已经都很清楚了,没必要再这里说啦
      

  9.   

    什么呀,在java中的String比较都是用equals()函数的呀,==这是用于数值比较的
      

  10.   

    在java中的String比较都是用equals()函数的呀,==这是用于数值比较的楼上的hehe我的问题是:如果用==这样处理为什么是这个结果,到底JVM是怎么处理的
      

  11.   

    而第二种定义就不同了,JAVA会每次新建立一块内存区域并把内存首址返回给句柄,所以用==比较返回false,你有没有搞错?结果是true,你运行一下看看是不是,如果是false,就对了,我和你的想法是一样的。可结果不是!
      

  12.   

    to: lewiha(神仙李) 
    对,是我的错,太快没贴全,具体请参看http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191763  ( 此第一种定义和第二种定义非我title中的定义 )此问题打住,我还是想搞清楚我的问题,有什么好的见解?
      

  13.   

    请问JAVA中是不是使用了懒惰技巧,就是说第二次分配因为和以前的内容一样了,所以就没有实际分配,而是直接指向了它?当你改变是在分配?
      

  14.   

    呵呵,这种问题很多经典的帖子,自己去找..
    呵呵,讨论这种问题的,一批讨论完了又来一批 :)
    这是java最基本的了...
      

  15.   

    呵呵  其实 lin_li_00(lin_li_000)应该是对的吧
    但讲得不是很清楚......
    模糊ing
      

  16.   

    我觉得楼主这个问题很好,说明很细心。我觉得情况是这样的
          String good = "Good";
          String s1 = good + "bye";
          String s2 = good + "bye";
      这样一来变量s1和s2分别指向两个不同的变量(因为用变量good和"+"号返回两个不同的变量了,故用==不会相等)
      而如果你写成这样的形式:
          String s1 = "good"+ "bye";
          String s2 = "good"+ "bye";  那么用==号比较肯定返回true
      

  17.   

    JAVA的string constants(常量)是共享的,当运用subString()方法时,将另外创建一个string。
      

  18.   

    class test1 {
       public static void main( String[] args ) {
          String good = "Good";
          String s1 = good + "bye";
          String s2 = good + "bye";%%%%%创建了一个新的String对象
            %%%%%%%%%              如果改为String s2 == s1;结果:ture%%%%
          System.out.println(s1 == s2);
    附加一条%%%%%%%%%%%%%
          System.out.println(s1.equals(s2));      
    则屏幕显示为:%%%%%%%%%5
    ture     %%%%%%%%%%
    ture     %%%%%%%%%%
       }
    }
    为什么打印为false

    class test2 {
       public static void main( String[] args ) {
          String  s1="hello" 
          String  s2="hello";  
          System.out.println(s1 == s2);
       }
    }
    为true
    test2的程序可以写为下面的
    class test1 {
       public static void main( String[] args ) {
          String hello, s1, s2;
          hello = "hello";
          s1 = hello;
          s2 = hello;
          System.out.println(s1 == s2);
       }
    }
    test2实际上是声明了3个String变量hello,s1,s2
    将字符变量"hello"赋值给hello,再将hello赋值给s1,再将s1赋值给s2;
    ==在用于对象的时候不是检查2个对象的值是否相等
    而是判断运算符两边引用的是否是同一个对象
    test2的hello,s1,s2引用的就是同一个对象
    而test1是给3个变量赋了相同的值
    ===========================================================================
    小弟初来乍到
    还望各位大哥指点
      

  19.   

    class test1 {
       public static void main( String[] args ) {
          String good = "Good";
          String s1 = good+"" ;
          String s2 = good+"";
          System.out.println(s1 == s2);
       }
    }
    运行为false
    而去了""又为true
      

  20.   

    首先要知道equals用来比较两个对象,而==用来比较两个地址是否相等
    第一段程序的两个不同的对象地址不同
    第二段两个对象的地址都在常量池里,是同一个地址
      

  21.   

    class test1 {
       public static void main( String[] args ) {
          String good = "Good";
          String s1 = good + "bye";
          String s2 = good + "bye";%%%%%创建了一个新的String对象
            %%%%%%%%%              如果改为String s2 == s1;结果:ture%%%%
          System.out.println(s1 == s2);
    附加一条%%%%%%%%%%%%%
          System.out.println(s1.equals(s2));      
    则屏幕显示为:%%%%%%%%%5
    ture     %%%%%%%%%%
    ture     %%%%%%%%%%
       }
    }
    为什么打印为false

    class test2 {
       public static void main( String[] args ) {
          String  s1="hello" 
          String  s2="hello";  
          System.out.println(s1 == s2);
       }
    }
    为true
    test2的程序可以写为下面的
    class test1 {
       public static void main( String[] args ) {
          String hello, s1, s2;
          hello = "hello";
          s1 = hello;
          s2 = hello;
          System.out.println(s1 == s2);
       }
    }
    test2实际上是声明了3个String变量hello,s1,s2
    将字符变量"hello"赋值给hello,再将hello赋值给s1,再将s1赋值给s2;
    ==在用于对象的时候不是检查2个对象的值是否相等
    而是判断运算符两边引用的是否是同一个对象
    test2的hello,s1,s2引用的就是同一个对象
    而test1是给3个变量赋了相同的值
      

  22.   

    这个问题我是这样的来理解的。
    在JAVA中。当你这样对一个String类型赋值时:String str1="123",String str2="123",当第一条语句执行时java会在内存中建立一个字符池。当执行第二条语句时,java编译器会首先在学符池中寻找有无相同的字符变量。如果有,会将第一个字符串的地址赋给第二个String类型变量。而使用“==“运算符时,不光对于String类型,对于所有对象的比较都是一样的。是对于对象引用的比较。这时str1和str2是相同的,所以相同。
    而当你采用:
          String good = "Good";String s1 = good + "bye";String s2 = good + "bye"; 这种赋值形式时。本身s1和s2的引用是不同的。所以结果为false。你可以采用equals()方法来进行判断两个字符串是否相等。如果要对字符串排序,可以用compareTo().
      

  23.   


    =========================================
    您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt 
    人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看看新闻也可以赚钱哦。想不到吧!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看新闻,赚现金!无须点击广告,不必投入资金! 
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    =======================================
    当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。 
    1.都是国内的大公司,信用问题你就不用担心了
     2.付款方式非常方便,银行汇款到你的银行卡里。
     3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
     4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    ========================================
    由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
    2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
    很简单的赚钱步骤:1,免费注册,注册地址:
    http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    2,免费下载NewsBar广告条(已经在文件夹里了)
    3,上网的时候打开并且登入,自动获得新闻点.
    4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
    4,每月1号准时结算~等着收钱吧!
    这是我们中国人自己的广告运营商.网站正处于高速发展期,
    基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
    支持网站的广告运营商就行了~简单吧!
    大家请放心.30元RMB就支付
    支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
    很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
    说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
      

  24.   


    =========================================
    您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt 
    人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看看新闻也可以赚钱哦。想不到吧!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看新闻,赚现金!无须点击广告,不必投入资金! 
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    =======================================
    当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。 
    1.都是国内的大公司,信用问题你就不用担心了
     2.付款方式非常方便,银行汇款到你的银行卡里。
     3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
     4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    ========================================
    由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
    2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
    很简单的赚钱步骤:1,免费注册,注册地址:
    http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    2,免费下载NewsBar广告条(已经在文件夹里了)
    3,上网的时候打开并且登入,自动获得新闻点.
    4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
    4,每月1号准时结算~等着收钱吧!
    这是我们中国人自己的广告运营商.网站正处于高速发展期,
    基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
    支持网站的广告运营商就行了~简单吧!
    大家请放心.30元RMB就支付
    支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
    很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
    说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
      

  25.   


    =========================================
    您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt 
    人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看看新闻也可以赚钱哦。想不到吧!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    看新闻,赚现金!无须点击广告,不必投入资金! 
    点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    =======================================
    当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。 
    1.都是国内的大公司,信用问题你就不用担心了
     2.付款方式非常方便,银行汇款到你的银行卡里。
     3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
     4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    ========================================
    由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
    2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
    很简单的赚钱步骤:1,免费注册,注册地址:
    http://www.ads4cn.com/newsbar/refferer.asp?navyzt
    2,免费下载NewsBar广告条(已经在文件夹里了)
    3,上网的时候打开并且登入,自动获得新闻点.
    4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
    4,每月1号准时结算~等着收钱吧!
    这是我们中国人自己的广告运营商.网站正处于高速发展期,
    基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
    支持网站的广告运营商就行了~简单吧!
    大家请放心.30元RMB就支付
    支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
    很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
    说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
      

  26.   

    版主呢? 还管不管了啊?java都成了无聊广告版了!!
      

  27.   

    to:gibosn(我在听你说)
    至于String str1="123",String str2="123"已经很清楚拉
    而你说的:
    String good = "Good";String s1 = good + "bye";String s2 = good + "bye"; 这种赋值形式时。本身s1和s2的引用是不同的具体原理是怎样呢?
      

  28.   

    to: kaymo(头发熟了) 
    我也遇到了你这个问题。详细查书之后得出以下答案
    一、首先String和其它基本型别的wrapper classes都是immutable objects(恒常对象),此种对象隶属于read-only classes(唯读类)。这种类的基本意思是它的状况是不可修改的。至于它的详细定义请查看thinking in java的附录。
    二、注意+这个运算符。当string 遇到"+"或者"+="时,这两个运算符就会被重载。这样的话
    String good = "Good";
    String s1 = good + "bye";
    String s2 = good + "bye";
    就会等于
    String good = "Good";//这个没变
    String s1 = good + "bye";
    /**这句变为
    StringBuffer sb = new StringBuffer(good);
    sb.append("bye");//“bye”会自动生成一个bye的String
    */
    //也一样
    String s2 = good + "bye";
    你注意到StringBuffer sb = new StringBuffer(good);
    了吧。我想你也明白了。他们都会重新生成一个新的对象。所以它们的句柄是不一样的。但也把的的代码改了一下。假如是这样的话
    class test1 {
       public static void main( String[] args ) {
          String s1 = "good" + "bye";
          String s2 = "good" + "bye";
          System.out.println(s1 == s2);
       }
    }
    我原来想遇到+运算符它也应该会同上面一样道理吧,但答案是错的。它输出的是true.
    所以我想"good"这些字符串这时候应该不是String的对象吧,不是的话上面的解释就可以说的通了。具体你最好详细看一下书中的解释,我也只能说出一部分。有什么问题大家再讨论吧。
      

  29.   

    我只知道,比值,不用 ==over