堆行为中的 Java new String 和 new StringBuilder
- 字符串池是否驻留在堆上?如果是,字符串字面量是否符合垃圾回收条件?
当使用 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:
new StringBuilder("abc")的行为方式是否与new String("abc")相同?如果是,StringBuilder 如何操作字符串池中的字符串字面量?
- Does
new StringBuilder("abc")behave the same way asnew 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.
相关文章