字符串是不可变的,因为它们存储在常量字符串池中.那么,stringbuilder对象在哪里创建?说,我创建了两个字符串构建器对象
StringBuilder s1 = new StringBuilder("abc");
StringBuilder s2 = new StringBuilder("abc");
Run Code Online (Sandbox Code Playgroud)
我最终会在堆内存中有两个独立的对象,它们都包含值"abc"?
字符串的不变性与存在常量字符串池几乎没有关系.或者更确切地说,它们必须是不可变的,因为字符串池才有用,但它们不一定是字符串池,因为它们是不可变的.
请注意,通常只有编译时常量会在字符串池中结束 - 除非您调用intern().例如,如果你有:
char[] x = { 'a', 'b', 'c' };
String s1 = new String(x);
String s2 = new String(x);
Run Code Online (Sandbox Code Playgroud)
然后s1与s2表示相同的字符串,但不同的对象.
创建两个StringBuilder对象只会创建两个对象.内部StringBuilder版本的确切实现细节可以在版本之间轻松更改,而且我不知道详细信息,但它可以很容易地char[]从传递给构造函数的字符串创建.(无论如何,我相信JDK 1.6就属于这种情况.)