为什么当我们在Java中声明字符串时我们不能使用==来比较这个字符串,它总是会变成false,但是如果我们从头开始初始化字符串那么它会是真的吗?
例如:
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");
}
}
这种行为的解释是什么?
答案 0 :(得分:3)
这是String.intern()自动为字符串文字发生的一个例子,但不是一般的。
如果您将代码更改为
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String s = input.nextLine();
s = s.intern();
if(s=="Hello")
System.out.println("Hello");
String d = "Hello";
if(d=="Hello")
System.out.println("Hello");
}
在控制台输入“Hello”后,您会看到“Hello”打印两次,因为“Hello”的所有副本都将被锁定到同一副本。
当然,您通常不应使用==
来比较字符串,而是使用
if (s.equals("Hello")
这种“实习生”过程是一种减少许多语言(包括Java)支持的内存使用的方法。当您调用s.intern()
时,运行时查找实习字符串池中字符串的副本,如果找到则使用一个字符串,否则使用一个字符串,以便只有该字符串的一个副本。有关一般概念的更多信息,请参阅this Wikipedia article。
答案 1 :(得分:2)
使用str.equals(str2)
。否则,您将比较对象是否具有相同的地址。
答案 2 :(得分:2)
原因是input.nextLine()
返回的字符串对象未被实现。因此,它与字符串文字"Hello"
所代表的字符串对象不同。
如果你输入“Hello”,你应该看到差异:
Scanner input = new Scanner(System.in);
String s = input.nextLine();
s = s.intern();
if (s == "Hello") {
System.out.println("Hello 1");
}
String d = "Hello";
if (d == "Hello") {
System.out.println("Hello 2");
}
答案 3 :(得分:1)
使用.equals()方法检查字符串相等性。 ==
检查两个引用变量是否指向同一个字符串对象。
答案 4 :(得分:-1)
nextLine()
在输入的字符串末尾添加"\n"
,使其不等于“Hello”。