Java 字符串是不可变的,实例化多个具有相同值的字符串会返回相同的对象指针。(有这个术语吗?“池化”似乎很合适,但这已经是指通过减少实例化来进行缓存以节省时间。)
Java 是否也对其他不可变的(用户定义的)类执行此操作(没有术语的事情)?Java 甚至可以检测到一个类是不可变的,还是字符串类独有的东西?
Java 字符串是不可变的,实例化多个具有相同值的字符串会返回相同的对象指针。(有这个术语吗?“池化”似乎很合适,但这已经是指通过减少实例化来进行缓存以节省时间。)
Java 是否也对其他不可变的(用户定义的)类执行此操作(没有术语的事情)?Java 甚至可以检测到一个类是不可变的,还是字符串类独有的东西?
正如这里的其他人所说,这个使用字符串的过程被称为实习。
值得一提的是,在 Java 7 中,具有相同字面值的字符串的行为可能是相同的对象,也可能不是。从 7 开始:
在 JDK 7 中,interned 字符串不再分配在 Java 堆的永久代中,而是与应用程序创建的其他对象一起分配在 Java 堆的主要部分(称为年轻代和年老代)中. 此更改将导致更多数据驻留在主 Java 堆中,而永久代中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但加载许多类或大量使用 String.intern() 方法的大型应用程序将看到更显着的差异。
查看Java SE 7 RFE以获取有关此内容的完整详细信息。
至于你自己的不可变对象,Java 并没有对它们做任何特别的事情——它不知道它们是不可变的。如果它可以检测到它的价值/可能,它可能会比其他方法更多地内联方法,但就编译器和 JVM 而言,它们只是另一个对象。
您正在查找的术语正在迭代。Java 在编译期间“自动”优化字符串,并让开发人员可以在运行时执行此操作。(有关优化的细节取决于 JVM 版本。)
就不可变对象而言。我不认为 Java 支持任何类型的机制来解决相同的实例。字符串类型不是此规则的例外。
原因是您必须使用运算符new
来创建实例。如果你使用new
创建字符串实例,你总是会得到两个不同的对象。
intering 仅适用于 String 类型。但是这个概念是免费的,你可以将这样的方法添加到你的不可变类中,并编写一个完成同样事情的方法。
字符串实习。维基百科:字符串实习
String Interning 仅对 String 类是唯一的。我想JVM不会将这些规则应用于用户定义的类。