为什么Java字符串有复制构造函数?

时间:2009-11-26 11:57:54

标签: java string

  

可能重复:
  What is the purpose of the expression “new String(…)” in Java?

它是不可变的,为什么你需要调用String.String(String str)

3 个答案:

答案 0 :(得分:15)

来自API doc:

Unless an explicit copy of original is needed, use of this constructor is
unnecessary since Strings are immutable. 

我能想到的唯一原因是:

  1. 您创建了一个非常大的String:A。
  2. 您创建了一个小子字符串:B基于A.如果您查看substring的实现,您会看到它引用相同的char []数组作为原始字符串。
  3. String A超出了范围,您希望减少内存消耗
  4. 创建B的显式副本意味着副本:B'不再引用大char[]。允许B超出范围将允许垃圾收集器回收支持A和B的大char[],只留下小char[]支持B'。

答案 1 :(得分:3)

new String(s)可以帮助Garbase收集:

String huge = ...;
String small = s.substring(0,2); //huge.value char[] is not garbage collected here
String gcFriendly = new String(small); //now huge.value char[] can be garbage collected

答案 2 :(得分:0)

以防你需要不相同但相等的字符串。

也许为了确保测试,人们确实str.equals(str2)代替(str == str2)。但我从来不需要它。