字符串池和字符串[]

时间:2017-02-02 21:45:52

标签: java string caching string-pool

 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))是不是也去了String池?

3 个答案:

答案 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