Java的String Intern是蝇量级的吗?

2022-09-04 22:12:24

Java的String内存池的实现是否遵循蝇量模式?

为什么我有这个怀疑,是因为我看到实习生没有外在的状态。在GoF中,我读到内在和外在状态之间应该有一个正确的平衡。但在实习生中,一切都是内在的。

或者我们应该说,关于属性没有严格的规则,仅仅共享对象以减少内存就足以称之为蝇量级。

请帮我理解。


答案 1

是的,实现遵循蝇量级模式。String.intern()

正如javadoc所说

返回字符串对象的规范表示形式。字符串池(最初为空)由类 String 私下维护。

调用 intern 方法时,如果池中已包含由 equals(Object) 方法确定的与此 String 对象相等的字符串,则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用。

因此,对于任何两个字符串 s 和 t,s.intern() == t.intern() 为真,当且仅当 s.equals(t) 为真。

所有文本字符串和字符串值常量表达式都将被暂存。字符串文本在 Java 语言规范的 §3.10.5 中定义

内部化的字符串驻留在“Perm Gen”空间中,并且可以使用运算符返回的字符串对象,因为对于相等的值,返回的对象始终相同。.intern()==.intern()

然后记住,该方法不会产生泄漏,因为今天的JVM能够使池垃圾。.intern()

尝试阅读这篇文章


答案 2

无论实习如何,Java String都通过在字符串和通过类似的方法调用从中派生的内容之间共享蝇量级模式来利用蝇量级模式。不过,这还有另一个方面:如果你取一个大字符串的小子字符串,那么巨大的字符串将不符合垃圾回收的条件。char[]substringchar[]

注意:从 OpenJDK 版本 1.7.0_06 开始,上述代码已经过时:代码已更改,因此不再在实例之间共享。 创建一个新数组。char[]substring()


推荐