我知道在String类的情况下,通常必须使用.equals()来比较两个字符串,例如:
String s1 = "123";
String s2 = "123";
String s3 = "1234";
s1.equals(s2); // true
s1.equals(s3); // false
但是,我今天尝试了这段代码:
s1 == s2; // true, but different references so had to return false
s1 == s3; // false
那么,java中有什么变化吗?现在使用==?
时字符串使用标准的可比实现答案 0 :(得分:3)
表达式"123"
不是String实例创建表达式;它表示对单个字符串实例的引用,该实例表示字符串池中的字符串值。
因此,变量s1
和s2
的值实际上是相同的。
答案 1 :(得分:2)
s1 == s2; // true,但不同的引用因此必须返回false
不,两者都在String文字池中引用相同的字符串文字对象"123"
。因此,当您使用==
如果使用String s = "Some"
创建对象,则从String Constant Pool引用该对象。
如果使用new运算符创建对象,则将在堆中创建String对象。
答案 2 :(得分:1)
==
仅检查引用引用的对象。
String s1 = "123";
String s2 = "123";
这里s1和s2指向相同的字符串池对象"123"
答案 3 :(得分:1)
String s1 = new String("123");
String s2 = new String("123");
s1.equals(s2); true
,因为在这种情况下,这种方法不是检查值而是检查对象,但s1==s2;
为false。
答案 4 :(得分:0)
如果将一个文字分配给一个String变量,它将指向String池中找到的内化String。但是如果你通过新的String(" 123")实例化一个String,你会得到一个新的。如果你想避免这种情况,只使用String池中的单例,你必须调用new String(" 123")。intern(),它将新实例放入池中,或者如果是一个相等的String已经在池中,返回其引用。来自JavaDoc:
当调用intern方法时,如果池已经包含一个等于#equals(Object)方法确定的String对象的字符串,则返回池中的字符串。否则,将此
String
对象添加到池中,并返回对此String
对象的引用。