有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

这两个字符串在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");
}

}

这种行为的解释是什么


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    使用。方法来检查字符串的相等性==检查两个引用变量是否指向同一个字符串对象

  3. # 3 楼答案

    原因是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");
    }
    
  4. # 4 楼答案

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

  5. # 5 楼答案

    这是字符串文本自动发生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