【问题标题】:String pool and String[] [duplicate]字符串池和字符串 [] [重复]
【发布时间】:2017-02-02 21:45:52
【问题描述】:
 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)) 中的字符串数组> 不是也去字符串池吗?

【问题讨论】:

  • 这不是因为它在一个数组中。这是因为您正在动态创建那些Strings (arr[i] = "aaa" + i)。
  • @mstorkson 他说的是字符串池,所以有必要展示他的想法。
  • @mstorkson 在我的情况下,通过 == 进行比较对于显示字符串池操作很重要;通过 equals() 一切都将是“真” - 字符串池中和之外的字符串。
  • #2: 正确。 --- #1: 见#2。 --- #3: 正确,又见#2。

标签: java string caching string-pool


【解决方案1】:

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

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

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

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

(理论背景见here

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

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

【讨论】:

  • 感谢您的关注! public static void main ( String[] args ) 怎么样? args String arr 有同样的逻辑吗?还是编译器对我的问题有某种例外?
  • 不客气。我做了一些更新,如果你喜欢我的回答,请考虑在某个时候接受 ;-)
【解决方案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]); 
}

【讨论】:

    【解决方案3】:

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

    “==”运算符

    在 Java 中,当“==”运算符用于比较 2 个对象时, 检查对象是否引用内存中的同一位置。在 换句话说,它检查 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
    

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2010-12-26
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多