我读过的文章和书籍使用String s = new String("...");
应该一直避免。我明白为什么会这样,但是使用 String(String) 构造函数有什么用处吗?我认为不存在,也没有看到任何其他证据,但我想知道 SO 社区中是否有人知道其用途。
这是一篇好文章:被认为无用的字符串构造函数最终证明是有用的! http://kjetilod.blogspot.com/2008/09/string-constructor-considered-useless.html
事实证明,这个构造函数实际上至少在一种情况下是有用的。如果您曾经查看过 String 源代码,您会发现它不仅具有用于 char 数组值和字符计数的字段,还具有用于到 String 开头的偏移量的字段。这样字符串就可以与其他字符串共享 char 数组值,这通常是调用 substring() 方法之一的结果。多年前,Java 在 jwz 的 Java 咆哮中就因此受到了著名的谴责:
造成这种开销的唯一原因是 String.substring() 可以返回共享相同值数组的字符串。这样做的代价是向每个 String 对象添加 8 个字节,这并不是净节省......
除了节省字节之外,如果您有这样的代码:
// imagine a multi-megabyte string here
String s = "0123456789012345678901234567890123456789";
String s2 = s.substring(0, 1);
s = null;
现在,您将拥有一个 String s2,尽管它看起来是一个单字符字符串,但它包含对在 String s 中创建的巨大 char 数组的引用。这意味着即使我们已经显式地将 String 清空,该数组也不会被垃圾收集!
解决这个问题的方法是使用我们之前提到的“无用”字符串构造函数,如下所示:
String s2 = new String(s.substring(0, 1));
众所周知,如果旧数组大于字符串中的字符数,则此构造函数实际上会将旧内容复制到新数组。这意味着旧的 String 内容将按预期被垃圾收集。快乐快乐快乐快乐。
最后,凯特·马森 http://hanuska.blogspot.com/2006/03/how-useful-is-stringstring-constructor.html?showComment=1169976540000#c5481901777730175548提出这些观点,
首先,字符串常量永远不会被垃圾回收。其次,字符串常量是实习的,这意味着它们在整个虚拟机中共享。这样可以节省内存。但它并不总是如你所愿。
String 上的复制构造函数允许您从 String 文字创建私有 String 实例。这对于构造有意义的互斥对象(出于同步目的)非常有价值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)