当我尝试用Java执行代码时,它给了我2个不同的输出
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);
答案 0 :(得分:8)
字符串是对象。 ==
比较对象引用,而不是字符串的内容。为此,请使用String#equals
方法。
在第一个示例中,txt1
和txt2
是指向相同 String
对象的两个变量。所以他们彼此==
。
在第二个示例中,txt1
和txt2
指向两个不同的 String
对象(具有相同的字符序列),因此它们是彼此不是==
。
另外:写new String("string literal")
几乎没有任何意义。如果你不明确地知道一个真正的,非常好的理由去做,不要。只有几个非常非常非常的异常情况,你可能会这样做,这与与低级别的东西进行交互有关。不是普通的可移植Java代码。
偶尔会使用new String(String)
(不是字符串 literal ,而是来自其他地方的实例,例如substring
)。有关详情,请参阅this article(感谢Rp-)。
答案 1 :(得分:3)
==
运算符将检查引用相等性,即如果两个参数true
是同一个实例,则返回String
。
每当一个String
文字(例如"Hello"
)出现在一个类中时,String
实例就是实习(存储在内部缓存中的那种,所以它可以重复使用)。
执行String txt1="Hello"
后,txt1
将与实习String
完全相同。所以,
String txt1="Hello";
String txt2="Hello";
txt1
和txt2
中的结果是同一个实例,即实习结果。
当你正在进行String txt1=new String("Hello")
时,它正在调用带有实例的String
构造函数作为参数(一种复制构造函数)。因此,txt1
将是新 String
实例,其持有与实例化实例相同的值,==
运算符将返回false
。< / p>
有关该主题的更多信息,请参阅JLS的3.10.5. String Literals部分。
字符串文字是对String类实例的引用 (§4.3.1,§4.3.3)。
此外,字符串文字总是指同一个类的实例 串。这是因为字符串文字 - 或者更一般地说是字符串 这是常量表达式的值(§15.28) - 是“实习” 以便使用String.intern方法共享唯一的实例。
以下问题的答案解释When are Java Strings interned?。以下链接详细说明了主题:String Equality and Interning。
作为旁注,请记住使用equals()
以便根据其内容执行字符串比较。
答案 2 :(得分:2)
Java尽可能尝试将字符串“共享”到安全空间。
String txt1="Hello";
String txt2="Hello";
是对同一个Object(“Hello”)
的两个引用String txt1=new String("Hello");
String txt2=new String("Hello");
是对两个不同实例的两个引用,每个实例都是由副本初始化的。
如果比较字符串,请始终使用“equals()”,否则很难预测结果。
答案 3 :(得分:0)
如果您想比较参考文献,请使用==
运算符。
如果要比较两个字符串的内容,请使用equals
方法。
答案 4 :(得分:0)
这样做
String txt1="Hello";
String txt2="Hello";
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);
String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);
你可以了解java内部的处理方式。