一方面;
String first = "thing";
String second = "thing";
if(first == second)
System.out.print( "Same things" ); //this is printed
另一方面;
String first = "thing";
String second = new String("thing");
if(first == second)
{
System.out.print("Same things");
}
else
{
System.out.print("Different things"); //This is printed
}
我知道" =="运算符用于比较两个对象的引用,但在第一个示例中,我直接比较了对象的值。我知道这种比较是不准确的。但为什么我在第一个例子中得到消息?它是指示引用是相同的,还是由巧合发生的?
答案 0 :(得分:3)
String pool
中使用 - 如果不使用new
关键字 - 每个新的String实例都会在该池上登陆,如果创建了具有相同值的String,则没有新对象是制作 - 正在使用游泳池中的那个。
答案 1 :(得分:0)
我认为Java是通过缓存使用此方法创建的字符串来优化的:
String second = "thing";
因此使他们“平等”。
这样做时:
String second = new String("thing");
您明确地使用这些内容分配新字符串,这会使您的if
条件成为错误。
答案 2 :(得分:0)
String first = "thing";
String second = new String("thing");
if(first.equals(second))
{
System.out.print("Same things");
}
else
{
System.out.print("Different things"); //This is printed
}
这应该可行。
答案 3 :(得分:0)
在第一个示例中,Java将完全相同的对象分配给第一个和第二个。
在第二个例子中,Java正在创建一个新的Object'second'(内部指向第一个)。所以你拥有的是第一个和第二个的两个字符串对象,但第二个内部包含对第一个的引用。
请参阅String#intern()的文档。从那以后:
返回字符串对象的规范表示。一池水 最初为空的字符串由String类私有维护。
当调用实习方法时,如果池已包含 字符串等于此字符串对象由equals(Object)确定 方法,然后返回池中的字符串。否则,这个 String对象被添加到池中以及对此String的引用 返回对象。
对于任何两个字符串s和t,s.intern()== t.intern() 当且仅当s.equals(t)为真时才为真。
所有文字字符串和字符串值常量表达式都是 实习。字符串文字在Java Language Specification
的§3.10.5中定义
答案 4 :(得分:0)
首先,first
和second
具有相同的参考。
但是在第二种情况下,它们有不同的参考。
使用==
,您实际上是在比较变量first
和second
中的值,它们是对字符串对象的引用。您不是在比较对象本身。使用equals
方法可以完成。
答案 5 :(得分:0)
字符串文字是interned您还可以使用
获取消息String first = "thing";
String second = new String("thing");
if(first.intern() == second.intern())
{
System.out.print("Same things"); //This is printed
}
else
{
System.out.print("Different things");
}