Java是否优化了不可变对象?

时间:2013-02-22 09:22:52

标签: java optimization immutability

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

Java是否也使用其他(用户定义的)不可变类来执行此操作(没有术语的事情)? Java甚至可以检测到一个类是不可变的,或者这是字符串类的独特之处吗?

5 个答案:

答案 0 :(得分:7)

WRT。字符串,你要找的字是interning

Java不会为您自己的不可变对象执行此操作。但它确实有盒装基元的缓存版本。有关详情,请参阅wrapper class caching上的这篇文章。

答案 1 :(得分:3)

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

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

  

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

请查看Java SE 7 RFE了解详情。

关于你自己的不可变对象,Java并没有对它们做任何特殊的事情 - 它不知道它们是不可变的。如果可以 内联方法,它可以检测到它的价值/可能性,但就编译器和JVM而言,它们只是另一个对象。

答案 2 :(得分:1)

你看起来这个词是itering。 Java在编译期间“自动”优化字符串,并使开发人员有可能在运行时执行此操作。 (有关依赖于JVM版本时优化内容的详细信息。)

到目前为止,对于不可变对象。我不认为Java支持任何类型的机制来解决相同的问题。字符串类型不是此规则的例外。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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