String str="sssssssss";
System.out.println(str.equals("sssssssss")); 

 String str="sssssssss";
System.out.println(str=="sssssssss"); 
为什么结果都为true
字符串比较应该都用equals吧!

解决方案 »

  1.   

    ==比较的是两个对象是否是同一个对象(物理地址),equals比较的是这两个对象的内容是否相等
      

  2.   

    java 的优化机制,他会在以前的字符串里面搜索"sssssssss"是否已经存在,如果存在则直接返回而不是新建一个对象
    所以你的2个判断都为true;如果你使用
    str==new String("sssssssss")
    进行判断,则会不等,因为new会强制新建一个字符串对象,导致只能用equals()比较内容才会相等了。
      

  3.   

    这是因为Java在编译期对字符串对象作了优化,采用了字符串池的机制,
    在字符串创建时先到池中看看是否有该对象,有的话,就直接引用,没有
    则重新创建,所以在使用==进行比较时它们的内存地址是一样的。
    当字符串变量值相同时==并不一定都是返回true。参考下面的代码:public class Test {    
        public static void main(String[] args) {        
            String str1 = "abcd";
            String str2 = "abcd";
            System.out.println(str1 == str2);
            System.out.println(str1.equals(str2));
            
            String str3 = "ab";
            String str4 = str3 + "cd";
            System.out.println(str4 == str2);
            System.out.println(str4.equals(str2));
        }
    }第一个str1==str2的比较值是true,因为在编译期字符串就已经确定的。
    第二个str4==str2的比较值是false,因为str4要在运行期才会被创建一个新的对象。个人认为,不要去太深究此类问题,Java规范明确地说明了比较值内容应该采用equals,而不应采用==。