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运营商.
在加载定义它们的类时,StringJava源代码中表示字符串文字的对象将添加到共享String池中.这确保了String文字的所有"副本"实际上都是同一个对象......即使文字出现在多个类中.这就是为什么s3 == s4是true.
相比之下,当您new使用String时,会创建一个不同的新String对象.这就是为什么s1 == s2是false.(这是它的基本属性new.保证创建并返回一个新对象......如果它正常完成.)
但是,在任何一种情况下,字符串都将具有相同的字符,这equals就是返回的原因true.
虽然理解正在发生的事情很重要,但真正的教训是比较Java字符串的正确方法是使用equals和不使用==.
如果要安排使用可以测试String对象的相等性==,可以使用该String.intern方法"实习"它们.但是,你必须始终这样做......并且实习在各个方面都是一个昂贵的过程...所以这通常不是一个好主意.