为什么String()构造函数不是私有的?

时间:2010-11-16 20:47:12

标签: java

在任何情况下,使用String()构造函数是否对字符串文字有益? 使用字符串文字可以重用现有对象,那么为什么我们需要公共构造函数呢?有没有真正的世界? 例如,两个文字都指向同一个对象。

String name1 = "name";//new String("name") creates a new object.
String name2 = "name";

4 个答案:

答案 0 :(得分:18)

构造函数有用的一个示例:String.substring()创建的字符串共享由它们创建的char[]的基础String。因此,如果你有String长度10.000.000(占用20MB内存)并将其前5个字符作为子字符串然后丢弃原始String,则该子字符串仍将保持20MB对象不被有资格进行垃圾收集。使用它上面的String构造函数可以避免这种情况,因为它只复制了String实例实际使用的底层char数组的一部分。

当然,如果您创建并使用相同String的大量子串,特别是如果它们重叠,那么您非常希望它们共享基础char[],并使用构造函数会适得其反。

答案 1 :(得分:3)

由于string是不可变的,因此像substring这样的操作会保留原始字符串,该字符串可能很长。使用构造函数从子字符串创建新字符串将创建一个新字符串,并允许删除旧字符串(到GC)。这种方式可以释放所需的记忆 例如:

String longS = "very long";
String shortS = new String(longS.substring(4));

答案 2 :(得分:0)

因为有时你可能想要创建一个副本而不只是对同一个字符串有一个新的引用。

答案 3 :(得分:0)

这里所有的好答案,但我认为值得指出的是,Java对待的文字与Strings构建的传统方式完全不同。

这是a good Q/A