public class Test {
private final static  String MESSAGE = "taobao";

public static void main(String arg[]){
String a = "tao" + "bao";
String b = "tao";
String c = "bao";

System.out.println(MESSAGE.hashCode());
System.out.println(a.hashCode());
System.out.println((b+c).hashCode());
System.out.println(b+c);

System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
System.out.println((b+c)==(b+c));

}
}结果:-881000146
-881000146
-881000146
taobao
true
false
falseJavaString

解决方案 »

  1.   

    http://blog.csdn.net/clam_clam/article/details/6829960已解决
      

  2.   

    System.out.println(a==MESSAGE);这里应该是比较的地址值,由于用哈希算法,所以地址值相同对吧?
            System.out.println((b+c)==MESSAGE);
            System.out.println((b+c)==(b+c));
      

  3.   

    System.out.println(a==MESSAGE); //a 当2个字符串常量相加时 会判断字符串池中是否有相同的值(taobao)
    此时 发现有相同的值  所以a也指向Message的值  a和Message都指向taobao 所以为true 
            System.out.println((b+c)==MESSAGE);//b+c 是2个字符串变量相加,会创建一个新的值
    这个新值和老值虽然内容相同,但是它们的地址不一样。所以为false
            System.out.println((b+c)==(b+c));
      

  4.   

    楼主可以用结果推出原因
    System.out.println(a==MESSAGE);//true  说明两个字符串常量相加不会生成新的String对象,当然,前提是常量池中包含相加后的字符串。
    System.out.println((b+c)==(b+c));//false    说明两个String变量b,c相加b+c会生成一个新的String对象

      

  5.   

    a 在编译时成为 “taobao“和 MESSAGE指向同一个字符串常量
      

  6.   

    String 中 == 比的是地址
    String a1 = new String("taobao"); 会生成一个新的对象
    String a = "tao"+"bao"; 会在字符串池中查找"taobao"字符串并指向它,所以a 和 MESSAGE指向同一地址
    b+c 是指向两个地址的字符串重组成一个串,会重新生成一个字符串对象,所以与MESSAGE比较结果不一样
    (b+c) == (b+c) 结果是false 是因为没执行一次b+c都会重新生成一个对象,地址自然不同
    String 中equals()重写了Object的equals方法 比的是值,有兴趣的话可以试试结果会全部是true
      

  7.   

    楼主可以参考http://blog.csdn.net/dream_broken/article/details/8759616