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”-

有人可以解释这两种情况的区别吗?
这是因为在第二种方法中
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变量现在将引用内存中的另一个对象。
有关字符串常量池的更多信息: 字符串常量池
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |