String a="hello";
String b="he";
String c="llo";
String d=b+c;
System.out.println(a==d);
System.out.println(a=="he"+"llo");
第一个是false,第二个是true,请问下原因,一直很困惑

解决方案 »

  1.   


    这么说吧楼主:System.out.println(a==d);这句话,你给定义了一个String 类型a并赋值hello到a,在java里,就新建了一块空间,并将hello放到了!a空间中的字符串池中。
    而d和的原理一样。
    但是System.out.println(a=="he"+"llo");这句就不一样了!这里你只新建了a的空间,并没有新建"he"+"llo"的空间。故此,你在用a和"he"+"llo"进行比较,默认java就认为你们是在相同的字符串池里,故此空间地址相同,字符值也相同。
      

  2.   

    我想再问下 String a="Hello"; 和 String b="Hello"; a==b,为true的原因?
      

  3.   

    又是此类问题,而且关键在于,这种问题会随着Java不同版本和不同的JVM有着不同的效果。
    你所掌握的只能是当前的情况,以后难免会发生变化。龙四有个Blog有个很好的扫盲贴,楼主可以看看,深入分析字符串连接最后编译的字节码:http://www.ticmy.com/?p=69
      

  4.   

    因为当a = "Hello"之后, 字符串池中就有了Hello这个地址, 那么对于String类型的引用再次生成相同字符串时, 会在已有的字符串池中寻找,如果字符串池中已有 直接指向该地址, 如果没有才会新建一个
      

  5.   

    我想再问下 String a="Hello"; 和 String b="Hello"; a==b,为true的原因?
    这是因为定义String a="Hello"的时候内存分配有稍许不同,是存放在常量池中,先查找字符串常量池中是否有“Hello”这个常量,没有则在字符串常量中创建; 当执行b时,由于常量池中已有“Hello”字符串,所以将b直接指向字符串常量“Hello”,这样,a和b就是指向同一个对象。
      

  6.   

    这是因为定义String a="Hello"的时候内存分配有稍许不同,是存放在常量池中,先查找字符串常量池中是否有“Hello”这个常量,没有则在字符串常量中创建; 当执行b时,由于常量池中已有“Hello”字符串,所以将b直接指向字符串常量“Hello”,这样,a和b就是指向同一个对象。
      

  7.   

    又来了:http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html