public class How{
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(a==b); }
}结果是true,但是我加了一个"",结果就变成false了,求高手解释public class How{
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(""+a==b); }
}
(结果是false)

解决方案 »

  1.   

    拼接后的String不是同一个引用了。
      

  2.   

    据我推测,a==b其实比较的是引用地址,本来a  b 是不应该是一样的,但是java编译器看两个字符串的内容是一样的,给优化处理了,让两个引用指向了同一个地址空间了,所以a==b 就是true了.
    但是,""+a 这个表达式却一定要建立一个新的字符串,因为java里面字符串的拼接是重新分配一个新的地址空间,然后再依次复制当前要拼接的两个字符串,虽然前面的""依然的依然是一个空的,但毫无疑问,新的地址空间仍然要建立,最后生成的字符串地址就跟b 不一样了,所以是false.至于为什么 新生成的字符串与b内容一样,为何不也优化处理,我就不知道原因了.
    以上属于个人见解,还是等高手回答.
      

  3.   

    String 的问题永远问不腻!
      

  4.   

    如果是a前拼接了"",但是那也是拼接了一个空的字符,a还是"JAVA",那应该在常量池中和b仍是同一个引用啊,为什么变成false了呢??求详解
      

  5.   

    System.out.println(""+a==b);  
      相当于 System.out.println((""+a)==b);
      这是运算符的优先级问题。没有啥好解释滴!
      

  6.   

    如果是这样 System.out.println((a==b)+" "); 就是TRUE了,应该是优先级的问题,== 低于+
      

  7.   

    四楼的童鞋说的很清楚了,对与String而言,==比较的就是地址
      

  8.   

    运算符优先级与结合性表 http://www.51cto.com/art/200708/54148.htm
      

  9.   

    a==b:
        String a = "JAVA";创建一个a字符串对象值为“JAVA”
        在遇到String b = "JAVA";时发同现b的值和a一样,java就让b引用a对象,
        所以a==b 为 true(同一对象)
    “”+a!=b: 
           对与java来说字符相加(“”+a)就是新创建对象,所以“”+a!=b
      

  10.   

    顶!JVM后面的版本为了不浪费资源,如果有重复的资源,他会同一个引用地址
      

  11.   

    优先级的问题,运算符优先级表运算符优先级表
    优先级 运算符 结合性 
    1 () [] . 从左到右 
    2 ! +(正) -(负) ~ ++ -- 从右向左 
    3 * / % 从左向右 
    4 +(加) -(减) 从左向右 
    5 << >> >>> 从左向右 
    6 < <= > >= instanceof 从左向右 
    7 == != 从左向右 
    8 &(按位与) 从左向右 
    9 ^ 从左向右 
    10 | 从左向右 
    11 && 从左向右 
    12 || 从左向右 
    13 ?: 从右向左 
    14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= 
    说明:
    1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
      

  12.   

        
    楼主的想法就是这样的,值比较
    public static void main(String[] args){
            String a = "JAVA";
            String b = "JAVA";
            System.out.println(""+a.equals(b));        }String是final 类型的类 对String来说 ==是引用的对象的内存地址比较, 初始化A B 以后,都是引用的是“JAVA”这个对象的地址引用
    一旦“”+a后,会JVM会重新为给“”+a指向一个内存地址,保存当前对象的引用和值,对象引用的内容发生了变化,
      

  13.   


    这个,我想了一下,不知道对不对,你参考一下,,b是字符串"java"的引用,这个不变。但是""和"java"拼接以后,会有一个新的地址来存储这个新的字符串,这个时候虽然内容与b引用的字符串是一样的,但是注意,这个时候java已经没有办法优化了,因为这个过程已经不是编译过程了,而是在代码的执行过程,是不会进行相同内容字符串地址的优化的,换一句话,编译器是不知道""+"java"和b指向的字符串是相同的,它默认的认为两个是不一样的。
      

  14.   

    ""+a创建了新的对象,引用的地址变了 而==比较的是引用地址 所以会是false
      

  15.   

    字符串拼接时,+号在解析后会编程StringBuffer,楼上的各位。
      

  16.   

    字符串拼接时,+号是使用StringBuffer来拼接的,希望楼上的各位,明白。
      

  17.   

    因为引用的地址发生改变,所以是FALSE
      

  18.   

    String 字符串是不能改变,拼接后生成新的String对象,两个不同的对象怎么可能相对。