Stringbuilder对象在哪里创建?

时间:2011-04-23 17:21:53

标签: java string

字符串是不可变的,因为它们存储在常量字符串池中。那么,stringbuilder对象在哪里创建? 比如说,我创建了两个字符串构建器对象

StringBuilder s1 = new StringBuilder("abc");  
StringBuilder s2 = new StringBuilder("abc");

我将在堆内存中以2个单独的对象结束,两个对象都包含值“abc”?

4 个答案:

答案 0 :(得分:5)

字符串的不变性与存在常量字符串池几乎没有关系。或者更确切地说,它们 是不可变的,因为字符串池很有用,但它们不一定是字符串池,因为它们是不可变的。

请注意,通常只有编译时常量会在字符串池中结束 - 除非您调用intern()。例如,如果你有:

char[] x = { 'a', 'b', 'c' };
String s1 = new String(x);
String s2 = new String(x);

然后s1s2引用相等的字符串,但不同的对象。

创建两个StringBuilder对象只会创建两个对象。 StringBuilder内部内容的确切实现细节可以在版本之间轻松更改,而且我不知道详细信息,但它很容易就是从传递给构造函数的字符串创建的char[]。 (无论如何,我相信JDK 1.6就属于这种情况。)

答案 1 :(得分:0)

String str1 = "Java"
String str2 = "Java"

因此,str1和str2指向文字池中的相同“Java”。

String str3 = new String("Java");
String str4 = new String("Java");

str3和str4没有指向同一个位置,但是分配了单独的内存。

StringBuilder s1 = new StringBuilder("abc");  
StringBuilder s2 = new StringBuilder("abc");

s1和s2不指向相同的内存位置。

因此,每当您说“ new ”时,它会为该变量创建一个单独的内存。

您可以通过在控制台上显示其地址来对此进行测试。

答案 2 :(得分:0)

常量池存储在源代码中定义为文字(用双引号括起来)的字符串。 非文字字符串不存储在CP中。他们只使用底层的char数组,并确保它永远不会被写入。

StringBuilder分配这样一个数组,然后将其交给新创建的String对象。

答案 3 :(得分:0)

在字符串文字池中创建用双引号创建的字符串文字。

StringBuilder对象始终在堆内存中创建。