public static void main(String[] args) {
String[] arr = new String[5];
for (int i = 0; i < arr.length; i++) {
arr[i] = "aaa" + i;
}
System.out.println(arr[0] == "aaa0"); // false
String s = "aaa0";
System.out.println(s == arr[0]); // false
}
我有一些关于这个话题的问题可以帮助我理解
与字符串文字不同,字符串数组中的字符串不会自动转到Sting池这一事实背后的原因是什么?
我是否正确理解只有字符串文字隐式转到字符串池?
我是否正确理解 public static void main 中的字符串数组(public static void main(String [] args))是不是也去了String池?
答案 0 :(得分:3)
编译器在for cover下转换for循环!
结果字节码将为每个循环迭代使用一个新的StringBuilder ...导致“新”创建的字符串对象!
含义;在“现实中;你的循环看起来更像”:
for (int i = 0; i < arr.length; i++) {
StringBuilder builder = new StringBuilder("aaa");
builder.append(i);
arr[i] = builder.toString();
}
(关于理论背景,请参阅here)
这是使用==来比较字符串的原因之一,因为它往往导致意想不到的结果。
关于你的评论:要点不是你正在使用的数组(其中:你应该不写入传递给main的数组 - 你可以,但这是不好的做法)。< / p>
答案 1 :(得分:2)
您可以调用intern()
方法来强制执行字符串池,即只存储每个不同字符串值的一个副本。
看看这个:
public static void main(String[] args) {
String[] arr = new String[5];
for (int i = 0; i < arr.length; i++) {
arr[i] = ("aaa" + i).intern();
}
System.out.println(arr[0] == "aaa0");
String s = "aaa0";
System.out.println(s == arr[0]);
}
答案 2 :(得分:0)
如果要比较两个对象的 THE CONTENT ,请使用equals()
。这里有更多的解释
“==”运算符
在Java中,当使用“==”运算符来比较2个对象时 检查对象是否引用内存中的相同位置。在 换句话说,它会检查两个对象名称是否基本相同 引用相同的内存位置。
equals()方法
equals方法在Object类中定义,每个都是 class是直接或间接的后代。默认情况下 equals()方法实际上与“==”运算符的行为相同 - 意思是它检查两个对象是否引用相同的位置 记忆。但是,equals方法实际上是要比较 2个对象的内容,而不是它们在内存中的位置。
System.out.println(arr[0].equals("aaa0")); // It give you True
System.out.println(s == arr[0]); // It give you false