System.out.println("a == helloworld:" + (a == ("hello" + "world")));//true
编译的时候就已经变成System.out.println("a == helloworld:" + (a == ("helloworld")));//true
编译器会优化,把可以进行的运算先运算好了,比如上面的字符串合并就在编译时就完成了
而由于a和"helloworld"在编译时拥有同样的值,所以肯定是引用同一常量池中的对象,所以==会返回true,
而下面的字符串合并时在运行时进行的,所以会创建新对象,所以==返回false

解决方案 »

  1.   

    "hello" + "world" 运算在常量池中,不产生新对象,运算结果就是a 指向的helloworld
    x + y 运算时,产生新对象,运算结果不再是a 指向的helloworld
      

  2.   

    纠结这些没大用,总之你要判断字符串相等,用equals就是了
      

  3.   

    String是不可变字符串,虽然在常量池,但分开字符串与合并字符串不是同一字符串。
      

  4.   

    4楼版主的话,我觉的比这个问题的正确答案对楼主而言还有用,
    学java是往深了学,还是往宽了学?没有孰优孰劣,反而很多时候是相互互补的关系.
    有些问题,最好不要去想,也不要去问,问了反而会影响自己的学习,以上纯属瞎编,
      

  5.   

     ("hello" + "world")先组成了helloword字符串 然后再分配的地址
      

  6.   

    同意斑竹的看法,会用String就行,如果要深究这个问题就去研究JVM,看内存是怎么分配的
      

  7.   

    string类比较基本上是不需要用过==的,因为没太大意义,用equals就可以了。本着实用性来说,是这样的,如果为了研究,请无视我说的。
      

  8.   

    使用JAVAP运行下,你就知道为什么了,jvm底层会进行自我优化
      

  9.   

    字符串==貌似比较的是地址。一般都是重写equals