字符串ID在Java中的含义是什么?
Possible Duplicate:
why equals() method when we have == operator?
当我尝试用Java执行代码时,它给了我两种不同的输出
String txt1="Hello";
String txt2="Hello";
System.out.println((boolean)txt1==txt2);
String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println((boolean)txt1==txt2);
# 1 楼答案
Java尽可能尝试将字符串“共享”到安全空间
是对同一对象的两个引用(“Hello”)
是对两个不同实例的两个引用,每个引用都由副本初始化
如果比较字符串,请始终使用“equals()”,否则结果很难预测
# 2 楼答案
这样做
您可以了解java如何在内部处理
# 3 楼答案
字符串是对象
==
比较对象引用,而不是字符串的内容。为此,请使用String#equals
方法在第一个示例中,
txt1
和txt2
是指向同一String
对象的两个变量。所以他们彼此==
在第二个示例中,
txt1
和txt2
指向两个不同的String
对象(它们具有相同的字符序列),因此它们彼此不==
另外:写
new String("string literal")
几乎没有任何意义。如果你不知道一个非常非常好的理由去做这件事,那就不要这样做。只有几个非常非常非常非常不寻常的情况下,你可能会这样做,这与与与低级事物的互动有关。不是在普通的可移植Java代码中偶尔有使用
new String(String)
的理由(不是字符串文本,而是从其他地方获得的实例,如substring
)。有关这方面的更多信息,请参见this article(谢谢Rp-)# 4 楼答案
如果要比较引用,请使用
==
运算符如果要比较两个字符串的内容,请使用
equals
方法# 5 楼答案
==
运算符将检查引用是否相等,即,如果两个参数String
是同一实例,则将返回true
每当类中出现
String
文本(例如"Hello"
)时,String
实例被interned(某种程度上存储在内部缓存中,以便可以重用)在做了
String txt1="Hello"
之后,txt1
将是与实习生String
非常相同的参考。所以结果
txt1
和txt2
是同一个实例,即,被拘留的实例当您执行
String txt1=new String("Hello")
时,它将调用String
构造函数,并将插入的实例作为参数(类似于复制构造函数)。因此,txt1
将是一个新的String
实例,其值与内部实例相同,==
操作符将返回false
关于这个主题的更多信息可以在JLS的3.10.5. String Literals部分找到
以下问题的答案解释了When are Java Strings interned?。下面的链接详细介绍了这个主题:String Equality and Interning
作为旁注,请记住使用
equals()
以便根据其内容执行字符串比较