说到java中的128陷阱,就需要先来聊一聊在Java 5中,对于Integer的操作引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。
这就要求我们具备Java的自动装箱和自动拆箱的知识。
简单一点说,
装箱就是 编译器调用valueOf方法将基本数据类型转换为包装器类型(即对象)(基本类型->引用类型);
拆箱就是 编译器通过调用intValue(),doubleValue()等方法将包装器类型(对象)转换为基本数据类型(引用类型->基本类型)。
下图是java的基本类型和引用类型的对应:
注意:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。
为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现?
因为在某个范围内的整型数值的个数是有限的,而浮点数却不是。
以integer的valueOf方法为例,让我们来看一下:
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference