何时“ ==”运算符成功比较字符串?

Rat*_*tus 2 java arrays string

我了解相等运算符会比较对字符串的引用。因此,它将检查字符串是否指向同一对象,而不是每个字符是否相等。

作为学习搜索算法的第一步,我设置了以下程序,该程序中有一个名称数组,然后检查该数组中是否存在某个名称。

第一种方法

我声明并初始化名称数组。我要求用户输入一个名称,以检查它是否出现在数组中。

这是我使用的代码-

import java.util.Scanner;

public class Strawman{

    public static void main(String[] args){

        System.out.println("Enter the name to search for:");

        Scanner scanner = new Scanner(System.in);
        String key = scanner.nextLine();

        String[] names = {"alice", "bob", "carlos", "carol", "craig", "dave", "erin", "eve", "frank", "mallory", "oscar", "peggy", "trent", "walter", "wendy"};

        for (int i = 0; i < names.length; i++){

            if (key == names[i]) {
                System.out.println("Index " + i + " has the name " + key);
            } 
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

以下屏幕快照显示了该程序的运行之一- 程序输出

不出所料,因为我使用==运算符比较字符串,所以即使出现在初始数组中,也无法在数组中找到名称“ oscar”。根据我对相等运算符如何比较字符串引用的理解,此输出是预期的。

但是,我不明白为什么该程序似乎有效,而不是要求用户输入而不是要求用户输入,而是将该名称声明为字符串。

第二种方法

已将要搜索的名称“ oscar”声明为字符串,而不是要求用户输入-

public class Strawman2{

    public static void main(String[] args){

        String[] names = {"alice", "bob", "carol", "craig", "carlos", "dave", "eve", "fred", "greg", "gregory", "oscar", "peter"};
        String key = "oscar";

        for (int i = 0; i < names.length; i++){

            if (names[i] == key){
                System.out.println("Index " + i + " has name " + key);
            }

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行该程序,则会在数组中找到名称“ oscar”- output_approach2

有人可以解释这两种情况的区别吗?

All*_*lan 6

这是因为在第二种方法中

String key = "oscar";
Run Code Online (Sandbox Code Playgroud)

重用由填充的字符串常量池中的实例

String[] names = {"alice", "bob", "carol", "craig", "carlos", "dave", "eve", "fred", "greg", "gregory", "oscar", "peter"};
Run Code Online (Sandbox Code Playgroud)

将启动键变量的方式更改为:

String key = new String("oscar");
Run Code Online (Sandbox Code Playgroud)

它的行为与第一种方法相同,因为您绕过了字符串常量池,并且key变量现在将引用内存中的另一个对象。

有关字符串常量池的更多信息: 字符串常量池