堆行为中的 Java new String 和 new StringBuilder

  1. 字符串池是否驻留在堆上?如果是,字符串字面量是否符合垃圾回收条件?

当使用 new String("abc") 时,我们知道它在堆上创建了一个对象,并将字符串字面量放入字符串池中.所以我的第二个问题是:

When using new String("abc"), we know that it creates an object on the heap and places the String literal in the String pool. So my 2nd question is:

  1. new StringBuilder("abc") 的行为方式是否与 new String("abc") 相同?如果是,StringBuilder 如何操作字符串池中的字符串字面量?
  1. Does new StringBuilder("abc") behave the same way as new String("abc") ? If yes, how does StringBuilder manipulate the String literal inside the String pool?

推荐答案

你混淆了编译时间、加载时间和运行时间.

You are confusing compile time, load time, and runtime.

在类加载时将字符串文字添加到常量池中.只需在类代码中的任何地方提及文字就足够了;您甚至不必在该类中执行任何代码行.

A string literal is added to the constant pool at class loading time. Just a mention of a literal anywhere in the class code is enough; you don't even have to execute any line of code in that class.

另一方面,表达式 new String("literal") 每次计算时都会产生一个新的 String 实例.该实例与常量池中的实例不同,并且具有字符串值的副本.

On the other hand, the expression new String("literal") yields a new String instance each time it is evaluated. That instance is distinct from the one in the constant pool and has a copy of the string value.

StringBuilder 在这方面的行为与 String 完全相同:它使用字符串文字值的副本进行初始化.

StringBuilder acts exactly the same way as String in this respect: it is initialized with a copy of the string literal's value.

相关文章