分配并创建新的字符串差异

sun*_*leo 5 java string

        String s1 = new String("string");
        String s2 = new String("string");

        String s3 = "string";
        String s4 = "string";

        System.out.println(s1 == s2);      //FALSE
        System.out.println(s2.equals(s1)); //TRUE

        System.out.println(s3 == s4);      //TRUE
        System.out.println(s3.equals(s4)); //TRUE
Run Code Online (Sandbox Code Playgroud)

创造s1和有s3什么区别?请告诉我

在String中我们只有String对象,那么为什么它以不同的方式处理这两个.s1和s2具有不同的存储器地址,而s3和s4具有相同的存储器地址.为什么它基于new运营商.

Ste*_*n C 5

在加载定义它们的类时,StringJava源代码中表示字符串文字的对象将添加到共享String池中.这确保了String文字的所有"副本"实际上都是同一个对象......即使文字出现在多个类中.这就是为什么s3 == s4true.

相比之下,当您new使用String时,会创建一个不同的新String对象.这就是为什么s1 == s2false.(这是它的基本属性new.保证创建并返回一个新对象......如果它正常完成.)

但是,在任何一种情况下,字符串都将具有相同的字符,这equals就是返回的原因true.


虽然理解正在发生的事情很重要,但真正的教训是比较Java字符串的正确方法是使用equals和不使用==.

如果要安排使用可以测试String对象的相等性==,可以使用该String.intern方法"实习"它们.但是,你必须始终这样做......并且实习在各个方面都是一个昂贵的过程...所以这通常不是一个好主意.