Java新String和堆行为中的新StringBuilder

时间:2015-01-25 15:04:10

标签: java string garbage-collection stringbuilder

  1. String池是否驻留在堆上?如果是,字符串文字是否有资格进行垃圾回收?
  2. 使用new String("abc")时,我们知道它在堆上创建了一个对象,并将String文字放在String池中。所以我的第二个问题是:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

在这方面,

StringBuilderString的行为完全相同:它使用字符串文字值的副本进行初始化。

答案 1 :(得分:1)

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

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

代码new StringBuilder("abc")new String("abc")的功能不同,因为它创建了一个StringBuilder对象而不是String。但是,由于String literal" abc",它确实确保了一个包含内容" abc"的String对象。在字符串池中。