我正在阅读关于Java 8更新20中有关字符串去重功能的内容(更多信息),但我不确定这是否基本上使得String.intern()
过时。
我知道这个JVM功能需要G1垃圾回收器,这对许多人来说可能不是一个选择,但假设使用G1GC,JVM自动去重和手动使用intern()
你的字符串之间是否存在任何差异/优劣势 (一个明显的优势是不必在代码中污染调用intern()
)。
考虑到Oracle可能会在Java 9中将G1GC作为默认GC,这尤其有趣。
我正在阅读关于Java 8更新20中有关字符串去重功能的内容(更多信息),但我不确定这是否基本上使得String.intern()
过时。
我知道这个JVM功能需要G1垃圾回收器,这对许多人来说可能不是一个选择,但假设使用G1GC,JVM自动去重和手动使用intern()
你的字符串之间是否存在任何差异/优劣势 (一个明显的优势是不必在代码中污染调用intern()
)。
考虑到Oracle可能会在Java 9中将G1GC作为默认GC,这尤其有趣。
使用这个功能,如果你有1000个不同的String对象,它们的内容都相同"abc"
,JVM可以使它们在内部共享同一个char[]
。但是,你仍然有1000个不同的String
对象。
使用intern()
,你只会有一个String
对象。因此,如果节省内存是你的关注点,intern()
会更好。它可以节省空间,以及垃圾回收时间。
然而,intern()
的性能并不太好,上次我听说是这样的。你最好自己建立字符串缓存,甚至使用ConcurrentHashMap
...但你需要对其进行基准测试以确保。
String.intern()
等效的行为。
你也可以用它来操作字符串。内存可能是(并且应该是)你最关心的性能问题,所以这种情况可能不经常出现:然而当你需要从某些热点区域挤出每一滴速度时,我的经验是基于Java的弱引用哈希映射解决方案比JVM的C++实现String.intern()
运行略快但始终如一,即使调整了jvm选项。(另外:你不需要调整JVM选项来处理不同输入的规模。)
我想介绍另一个与目标受众相关的决策因素:
String
类。 - fge