缓存实例在多大程度上用于公共 Float 和 Double 值?
To what extent are cached instances used for common Float and Double values?
对于 Integer 和其他一些数字类型,在调用 valueOf 或自动装箱原始值时,会重新使用表示 -128 到 127 范围内值的实例。
但是 Float 和 Double 呢? javadoc for valueOf 暗示它可能同样使用缓存值:
If a new Float instance is not required, this method should generally
be used in preference to the constructor Float(float), as this method
is likely to yield significantly better space and time performance by
caching frequently requested values.
但是,与 Integer's valueOf ("This method will always cache values in the range...") 相比,此声明不太明确,并且没有说明可能进行此优化的一组值。那么这在实践中实际表现如何?
虽然 Javadoc 说可以使用缓存,但我只是检查了我 JDK(版本 8)中的实现,并没有实现缓存:
public static Float valueOf(float f) {
return new Float(f);
}
public static Double valueOf(double d) {
return new Double(d);
}
我不知道这样的缓存效果如何。与 Integer
、Long
、Byte
、Short
和 Character
(缓存值是一串连续数字的小序列)不同,不太清楚哪个 Double
和 Float
值应该被缓存。
查看 Float.valueOf
(JDK 8) 的实现,我发现它只是通过调用构造函数创建了一个新的 Float 对象。
public static Float valueOf(float f) {
return new Float(f);
}
所以,这可能是对未来的优化。
对于 Integer 和其他一些数字类型,在调用 valueOf 或自动装箱原始值时,会重新使用表示 -128 到 127 范围内值的实例。
但是 Float 和 Double 呢? javadoc for valueOf 暗示它可能同样使用缓存值:
If a new Float instance is not required, this method should generally be used in preference to the constructor Float(float), as this method is likely to yield significantly better space and time performance by caching frequently requested values.
但是,与 Integer's valueOf ("This method will always cache values in the range...") 相比,此声明不太明确,并且没有说明可能进行此优化的一组值。那么这在实践中实际表现如何?
虽然 Javadoc 说可以使用缓存,但我只是检查了我 JDK(版本 8)中的实现,并没有实现缓存:
public static Float valueOf(float f) {
return new Float(f);
}
public static Double valueOf(double d) {
return new Double(d);
}
我不知道这样的缓存效果如何。与 Integer
、Long
、Byte
、Short
和 Character
(缓存值是一串连续数字的小序列)不同,不太清楚哪个 Double
和 Float
值应该被缓存。
查看 Float.valueOf
(JDK 8) 的实现,我发现它只是通过调用构造函数创建了一个新的 Float 对象。
public static Float valueOf(float f) {
return new Float(f);
}
所以,这可能是对未来的优化。