1
 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 
    }

我有几个关于这个话题的问题可以帮助我理解

  1. 与字符串文字不同,字符串数组中的字符串不会自动进入 Sting 池这一事实背后的登录是什么?

  2. 我是否正确理解只有字符串文字会隐式进入字符串池?

  3. 我是否正确理解来自public static void main ( public static void main(String[] args) ) 的字符串数组也不会进入字符串池?

4

3 回答 3

3

编译器在幕后转换了 for 循环!

并且生成的字节码将为每个循环迭代使用一个新的 StringBuilder ......导致“新”创建的字符串对象!

意义; 在“现实中;你的循环看起来“更像”:

for (int i = 0; i < arr.length; i++) {
  StringBuilder builder = new StringBuilder("aaa");
  builder.append(i);
  arr[i] = builder.toString();
}

(见这里的理论背景)

这就是使用 == 比较字符串名声不好的原因之一……因为它往往会导致意想不到的结果。

关于您的评论:重点不是您正在使用的数组(其中:您应该写入传递给 main 的数组 - 您可以,但这是不好的做法)。

于 2017-02-02T21:50:53.840 回答
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]); 
}
于 2017-02-02T21:52:54.473 回答
0

equals()如果要比较 两个对象的内容,请使用。这里有更多的解释

“==”运算符

在 Java 中,当“==”运算符用于比较 2 个对象时,它会检查对象是否引用内存中的同一位置。换句话说,它检查这两个对象名称是否基本上是对同一内存位置的引用。

equals() 方法

equals 方法在 Object 类中定义,每个类都是该类的直接或间接后代。默认情况下,equals() 方法的行为实际上与“==”运算符相同——这意味着它检查两个对象是否引用内存中的相同位置。但是,equals 方法实际上是为了比较 2 个对象的内容,而不是它们在内存中的位置。

System.out.println(arr[0].equals("aaa0")); // It give you True
System.out.println(s == arr[0]); // It give you false
于 2017-02-02T21:53:51.077 回答