这两个字符串在Java中有什么不同
Possible Duplicate:
Java String.equals versus ==
为什么当我们在Java中声明字符串时,不能使用==来比较这个字符串,它总是会变为false,但是如果我们从一开始就初始化字符串,它就会变为true
例如:
import java.util.Scanner;
public class MyString {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.nextLine();
if(s=="Hello")
System.out.println("Hello");
String d = "Hello";
if(d=="Hello")
System.out.println("Hello");
}
}
这种行为的解释是什么
# 1 楼答案
nextLine()
在输入的字符串末尾添加一个"\n"
,使其不等于“Hello”# 2 楼答案
使用。方法来检查字符串的相等性
==
检查两个引用变量是否指向同一个字符串对象# 3 楼答案
原因是
input.nextLine()
返回的字符串对象没有被扣押。因此,它与字符串文本"Hello"
表示的字符串对象不同根据以下内容,如果输入“Hello”,您应该会看到区别:
# 4 楼答案
使用
str.equals(str2)
。否则,您将比较对象是否具有相同的地址# 5 楼答案
这是字符串文本自动发生String.intern()的一个例子,但一般不发生
如果你把代码改成
在控制台中输入“Hello”时,您将看到“Hello”打印两次,因为此时“Hello”的所有副本都将被保存到同一副本中
当然,通常不应该使用
==
来比较字符串,而应该使用这种“实习”过程是一种减少内存使用的方法,包括Java在内的许多语言都支持这种方法。当您调用
s.intern()
时,运行时会在一个托管字符串池中查找该字符串的副本,如果找到,则使用一个副本,否则生成一个副本,因此该字符串只有一个副本。有关总体思路的更多信息,请参见this Wikipedia article