10

Java 字符串是不可变的,实例化多个具有相同值的字符串会返回相同的对象指针。(有这个术语吗?“池化”似乎很合适,但这已经是指通过减少实例化来进行缓存以节省时间。)

Java 是否也对其他不可变的(用户定义的)类执行此操作(没有术语的事情)?Java 甚至可以检测到一个类是不可变的,还是字符串类独有的东西?

4

5 回答 5

7

写。字符串,您要查找的词是interning

Java 不会为您自己的不可变对象执行此操作。不过,它确实有盒装原语的缓存版本。有关更多信息,请参阅这篇关于包装类缓存的文章。

于 2013-02-22T09:24:40.413 回答
3

正如这里的其他人所说,这个使用字符串的过程被称为实习。

值得一提的是,在 Java 7 中,具有相同字面值的字符串的行为可能是相同的对象,也可能不是。从 7 开始:

在 JDK 7 中,interned 字符串不再分配在 Java 堆的永久代中,而是与应用程序创建的其他对象一起分配在 Java 堆的主要部分(称为年轻代和年老代)中. 此更改将导致更多数据驻留在主 Java 堆中,而永久代中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但加载许多类或大量使用 String.intern() 方法的大型应用程序将看到更显着的差异。

查看Java SE 7 RFE以获取有关此内容的完整详细信息。

至于你自己的不可变对象,Java 并没有对它们做任何特别的事情——它不知道它们是不可变的。如果它可以检测到它的价值/可能,它可能会比其他方法更多地内联方法,但就编译器和 JVM 而言,它们只是另一个对象。

于 2013-02-22T09:45:05.407 回答
1

您正在查找的术语正在迭代。Java 在编译期间“自动”优化字符串,并让开发人员可以在运行时执行此操作。(有关优化的细节取决于 JVM 版本。)

就不可变对象而言。我不认为 Java 支持任何类型的机制来解决相同的实例。字符串类型不是此规则的例外。

原因是您必须使用运算符new来创建实例。如果你使用new创建字符串实例,你总是会得到两个不同的对象。

intering 仅适用于 String 类型。但是这个概念是免费的,你可以将这样的方法添加到你的不可变类中,并编写一个完成同样事情的方法。

于 2013-02-22T09:26:59.243 回答
0

字符串实习。维基百科:字符串实习

于 2013-02-22T09:26:05.737 回答
0

String Interning 仅对 String 类是唯一的。我想JVM不会将这些规则应用于用户定义的类。

于 2013-02-22T09:26:29.057 回答