根据 String.intern() 的 Javadoc:
当调用intern方法时,如果池中已经包含与该String对象相等的字符串(由equals(Object)方法确定),则返回来自池中的字符串。否则,将该String对象添加到池中并返回对该String对象的引用。
我有几个问题:
1. 当创建一个新的String对象(不使用字符串字面值,而是使用new()运算符)时,如下所示: ``` String str = new String("Test"); ```
问题:我知道在堆中会创建一个新对象。但是,在对象创建过程中是否也会将字符串
当调用intern方法时,如果池中已经包含与该String对象相等的字符串(由equals(Object)方法确定),则返回来自池中的字符串。否则,将该String对象添加到池中并返回对该String对象的引用。
我有几个问题:
1. 当创建一个新的String对象(不使用字符串字面值,而是使用new()运算符)时,如下所示: ``` String str = new String("Test"); ```
问题:我知道在堆中会创建一个新对象。但是,在对象创建过程中是否也会将字符串
Test
放入字符串池中?如果是,为什么不直接返回字符串池中的引用。如果不是,为什么不直接将字符串放入池中,现在StringPool已经从PermGen中移出,并且处于常规堆空间中(即除了堆空间限制外没有其他空间限制)。有一些帖子声称在创建对象时立即将字符串插入池中,而也有一些帖子与此相矛盾。
当我们在 String 对象上调用 String.intern()(因为字面量已经被 interned),对象分配的空间会发生什么?它会在同一时刻被回收,还是等待下一个 GC 循环?
在 SO 上 另一个问题 的被接受的答案指出,当你需要速度时应该使用 String intern,因为你可以通过引用比较字符串(== 比 equals 更快)。
问题:我知道使用 String.intern() 时,它返回对已存在于 StringPool 中的字符串的引用。但这需要在 StringPool 上进行全扫描查找,这本身可能是昂贵的操作。那么,在字符串比较期间实现的这种速度是否合理?如果是,为什么?
我已经查看了以下来源:
- JavaDoc(Java文档)
- SO问题ques1(问题1),ques2(问题2),ques3(问题3)
- http://java-performance.info/string-intern-in-java-6-7-8/(Java 6、7、8中的字符串内部化)
- 以及来自SO和外部世界的其他杂项来源
O(1)
的操作,因为在其背后肯定有一个类似于哈希表的数据结构。 - Kayaman"Test"
传递给构造函数,并且引用字符串字面量"Test"
会将其放入字符串池中。然后,您调用new
,这明确要求Java制作副本并返回该副本,而不是字符串池中的引用。 - Louis WassermanString
构造函数。 - Louis Wasserman