【问题标题】:Does Java implemented Flyweight design pattern with Strings? [duplicate]Java 是否使用字符串实现了享元设计模式? [复制]
【发布时间】:2016-09-19 04:07:33
【问题描述】:

根据 GOF 对“享元”的定义,重用\共享相似类型的对象以减少内存增长。

如果是这种情况,java 字符串对象通过使用字符串常量池来做同样的事情。那么我们可以说Java String 实现了享元设计模式吗?如果不是,为什么?

【问题讨论】:

标签: java string design-patterns memory reusability


【解决方案1】:

我们可以说,Java String 实现了享元设计模式吗?

不是真的。或者充其量你可以说它可以实现那个模式。

字符串常量池只包含String对应的对象:

  • Java 字符串 >>literals
  • 其他编译时字符串常量,以及
  • 由调用String.intern() 方法的应用程序或库方法故意“嵌入”的字符串对象。

普通 Java String 对象不会在字符串池中创建。相反,它们是在普通堆中创建的,并且只能通过调用intern()“放入池中”。这是有充分理由的。如果默认情况下所有字符串都被保留,则会增加 GC 开销和/或典型 Java 应用程序的长期内存占用。

(请注意,Java 8 现在在 G1 收集器中有一个可选的 string deduplication feature,它通过组合相等的字符串的 char 数组来节省空间。)

【讨论】:

  • 普通的java字符串是什么意思? java中的每个字符串都是一个常量,正确吗?所以它应该在常量池中创建吧?
  • 我的意思是通过调用字符串构造函数或方法之一创建的字符串(intern 除外)。字符串不可变这一事实并不意味着它们(必然)是在池中创建的。
  • 如果您不相信我,请查看 Java 源代码。
【解决方案2】:

是的,Java 的字符串池是享元模式的一个很好的例子。如wikipedia article on the subject所述:

[这种模式的]另一个例子是字符串实习。

【讨论】:

  • 维基百科的文章是正确的,但 IMO 你的结论并不完全正确。 String interning 是该模式的一个示例,但这不适用于整个“Java String”(OP 使用的术语)。
  • Interning 比享元更接近缓存。恕我直言,这里的线条很模糊。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2011-01-27
  • 2019-09-10
相关资源
最近更新 更多