java - Java 是否使用字符串实现享元设计模式?

标签 java string design-patterns memory reusability

<分区>

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

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

最佳答案

Can we say that, Java String implements the Flyweight design pattern?

不是真的。或者充其量您可以说它可以实现该模式。

字符串常量池只包含对应于:

String对象
  • 源代码中的Java字符串>>文字<<,
  • 其他编译时字符串常量,以及
  • 已被调用 String.intern() 方法的应用程序或库方法故意“留存”的字符串对象。

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

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

关于java - Java 是否使用字符串实现享元设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37371303/

相关文章:

java - 我们可以创建一个 Spring ScheduledExecutorTask 池吗?

java - 我的输出为 Null,而不是使用字符串的默认值

java - 防止在 SWT DirectoryDialog 中选择文件夹

string - Delphi 中的 IP 地址字符串例程?

c++ - 更通用的访问者模式

java - Spring MVC 和自定义标签

Python:固定长度字符串多个变量左/右对齐

c++ - 我如何告诉 gcc 警告我字符串被分配了一个整数值?

html - 我应该在页面上使用一个表单还是为每个项目生成一个表单?

android - 在没有任何静态引用的情况下使用上下文