堆行为中的 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.
相关文章