0

可能重复:
Java String.equals 与 ==

为什么当我们在Java中声明字符串时,我们不能使用==来比较这个字符串,它总是会变成假,但是如果我们从头开始初始化字符串,它会是真的?

例如 :

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");
}

}

这种行为的解释是什么?

4

5 回答 5

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()运行时在一个内部字符串池中查找该字符串的副本时,如果找到则使用一个,否则创建一个,以便该字符串只有一个副本。有关一般概念的更多信息,请参阅此 Wikipedia 文章

于 2012-11-11T23:19:09.323 回答
2

使用str.equals(str2). 否则,您正在比较对象是否具有相同的地址。

于 2012-11-11T22:58:19.317 回答
2

原因是返回的字符串对象input.nextLine()没有被interned。因此,它与字符串字面量所表示的对象不是同一个字符串对象"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");
}
于 2012-11-11T23:15:59.327 回答
1

使用 .equals() 方法检查字符串是否相等。==检查两个引用变量是否指向同一个字符串对象。

于 2012-11-11T22:56:02.347 回答
-1

nextLine()在输入字符串的末尾添加 a "\n",使其不等于“Hello”。

于 2012-11-11T22:56:19.680 回答