这两个字符串在Java中有什么区别

时间:2012-11-11 22:52:35

标签: java string

  

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

为什么当我们在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");
}

}

这种行为的解释是什么?

5 个答案:

答案 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”。