【发布时间】:2015-10-17 08:15:39
【问题描述】:
据我了解
String s = new String("abc") 将创建两个对象-
- String 常量池中的一个(如果
"abc"尚未在常量池中) - 堆内存中的一个
尽管对于实际创建的对象数量和位置存在多种理解。
无论如何我有以下问题 -
- 为什么 String 类的 java 文档中没有包含关于将创建多少对象以及在哪里创建的内容?
- 为什么
new String(String)在 String 类中提供,但字符串是不可变的?也可以假设由String s = "abc"或String s = new String("abc")创建的所有字符串都将在字符串常量池中可用?李> -
StringBuilder或StringBuffer中用于创建或附加的字符串字面量,它们是否也进入字符串常量池或仅保留在堆内存中。
编辑
intern()方法的 java 文档清楚地谈到了常量池,但是String(String)没有这样说的。
【问题讨论】:
-
WRT“需要”:接近0,不记得前几年用过。也许是为了测试没有缺陷的
==比较或其他奇怪的原因,比如想要一个安全的锁对象,它也会打印自己。自动代码分析甚至可能会发出警告。 -
@zapl - 从历史上看,构造函数有一个真正的目的 - 使用较小的 char 数组制作副本。见stackoverflow.com/q/16123446/2158288