Java新String和堆行为中的新StringBuilder

  1. String池是否驻留在堆上? 如果是,String字符串是否有资格进行垃圾回收?

当使用new String("abc") ,我们知道它在堆上创建了一个对象并将String文本放在String池中。 所以我的第二个问题是:

  1. new StringBuilder("abc")行为与new String("abc")行为方式相同吗? 如果是,StringBuilder如何操作String池中的String文字?

您正在混淆编译时间,加载时间和运行时。

在类加载时将字符串文字添加到常量池中。 只需在类代码中的任何地方提及文字即可; 你甚至不必在该类中执行任何代码行。

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

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

首先,是的,字符串池和它包含的字符串在堆上。 一旦字符串文字在字符串池中,它就永远不会从中删除。 因此,字符串池中的所有字符串文字都可以访问,直到程序终止,因此不符合垃圾回收的条件。 (通过其他方式添加到字符串池的字符串可能有资格进行垃圾回收。)

如果我们用new String("abc")创建一个新的String对象,那么会发生两件事:首先,由于字符串文字“abc”,创建了一个新的String对象,其内容为“abc”,并添加到字符串池中(如果还没有那里)。 然后,由于new String(...)构造函数,创建了一个新的String对象,它是字符串文字的副本。 此新字符串未放置在字符串池中。 因此, new String("abc") == "abc"不成立。

代码new StringBuilder("abc")new String("abc") ,因为它创建了一个StringBuilder对象而不是String。 但是,由于字符串文字“abc”,它确实确保内容为“abc”的String对象位于字符串池中。