String a = "ab"; 
String c = "a"; 
String d = "b"; 
System.out.println(a==(c+d)); 
System.out.println(a==("a"+"b"));结果是 false       true为什么?

解决方案 »

  1.   

    "ab"这个字符串常量只会分配一次内存,"a"+"b"等同与"ab"
    对于对象类型,==比较的是内存地址
      

  2.   

    这答案在“JAVA编程思想”里有
      

  3.   

    '=='比较的是内存地址,不是值
    String a = "ab"; 
    String c = "a"; 
    String d = "b";分别在内存中创建了三个对象,占用了不同的地址,比较址可以用c.equals(c+d);
      

  4.   

    使用a.equals()....==是判断两个是否为同一个对象实例。
      

  5.   

    ==是判断两个是否为同一个对象实例的两个副本
    若要判断内容相同用a.equals(b)
      

  6.   

    感觉说的不清楚啊,加油,等待中。问题的关键是 c + d的时候做了什么?
            String a = "ab";
            String c = "a";
            String d = "b";
            String e = "a"+"b";
            
            System.out.println((c+d).hashCode());
            System.out.println(("a"+"b").hashCode());
            System.out.println("ab".hashCode());
            System.out.println(a.hashCode());
    hashCode是这个对象的唯一标示,==的判断是根据引用的地址,可否简单的理解成hashCode的值?
      

  7.   

    使用a.equals()
    -------------------------
    我是问为什么会处先这种情况,不是说不知道用a.equals()这个比较。这里跟equals()没有关系
      

  8.   

    '=='比较的是内存地址,不是值
    ----------------------------------------
    这个我明白。
    为什么"ab" 和 "a" + "b" 的地址相同
    而和 c + d 的地址不同呢?
      

  9.   

    ==  比较的是类的相同。同意 polarman(北极人)  的意见
      

  10.   

    这种方式和编译器有关
     "a"+"b" 被编译时处理为"ab"
    但是c+d是运行时处理的(因为是变量)
      

  11.   

    c+d后的值存入了一个临时变量,该变量地址和a不同
    “a”+“b”相当与“ab”,虚拟机会在常量池中查找“ab”,如果匹配则临时分配一变量指向该入口,那么地址就和a一样了
    不知道这样理解对不对
      

  12.   

    Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。
      所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息
      

  13.   

    usaspy(行走的鱼) 贴的对,补充点简单说明如下:Java中处理String常量的方式是使用的享元模式,就是每生成一个新的常量String都会先检查这个常量的String是否已经在内存中存在,如果有,则直接返回这个常量String的地址。但是处理变量的默认方式就不同,两个String变量相加总是生成的一个新的String,相当于new了一个新的String。所以,两个变量相加得到的是一个新建的String,而两个常量相加得到的却是已有的那个常量的地址了。