字符串是不可变的,因为它们存储在常量字符串池中。那么,stringbuilder对象在哪里创建? 比如说,我创建了两个字符串构建器对象
StringBuilder s1 = new StringBuilder("abc");
StringBuilder s2 = new StringBuilder("abc");
我将在堆内存中以2个单独的对象结束,两个对象都包含值“abc”?
答案 0 :(得分:5)
字符串的不变性与存在常量字符串池几乎没有关系。或者更确切地说,它们 是不可变的,因为字符串池很有用,但它们不一定是字符串池,因为它们是不可变的。
请注意,通常只有编译时常量会在字符串池中结束 - 除非您调用intern()
。例如,如果你有:
char[] x = { 'a', 'b', 'c' };
String s1 = new String(x);
String s2 = new String(x);
然后s1
和s2
引用相等的字符串,但不同的对象。
创建两个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对象始终在堆内存中创建。