Integer对象范围(-128-127)之间(Integer. valueOf()方法)

简介: Integer对象范围(-128-127)之间(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用


Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会报错

看下面代码示例

取值为127时


取值为128时


为什么会是这样呢?

首先,我们看一下双等号“ == ”和equals()方法的不同之处。

双等号“ == ”,对于基本数据类型,比较的是它们的值。

对于非基本类型,比较的是它们在内存中的存放地址,或者说是比较两个引用是否引用内存中的同一个对象。


equals()是在Object基类中定义的方法。

这个方法的初始行为是比较对象的内存地址,但在一些类库中,这个方法被覆盖掉了,如String,Integer,Date等。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,它们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号“ == ”进行比较的,所以比较后的结果跟双等号“ == ”的结果相同。



看下源码:



从下面的源码可以看出,valueOf()在返回之前,会进行判断,判断当前 i的值是否在 -128到127之间。

如果存在,则直接返回引用,不再重新开辟内存空间。

如果不存在,就创建一个新的对象。

利用缓存,这样做既能提高程序执行效率,还能节约内存。


在Integer类装载入内存时,把[-128, 127]范围内的整型数据装包成Integer类,并将其对应的引用放入到cache数组中。


从上面的源码可以看出,valueOf()在返回之前,会进行判断,判断当前 i的值是否在 -128到127之间。

如果存在,则直接返回引用,不再重新开辟内存空间。

如果不存在,就创建一个新的对象。

利用缓存,这样做既能提高程序执行效率,还能节约内存。


Integer a1= 127; Integer a2 = 127; 因为 IntegerCache中已经存在此对象,直接返回引用,引用相等并且都指向缓存中的数据,所以这时候a1 == a2返回true。


Integer a1 = 128; Integer a2 = 128;因为a1,a2的值大于127,不在[-128, 127]范围内,所以虚拟机会在堆中重新new一个 Integer对象来存放128,创建两个对象就会产生两个这样的空间。两个空间的地址不同,返回到栈中的引用的值也就不同,所以这时候a1 == a2返回false。

 

相关文章
|
6月前
|
Java 开发者
使用HashMap的values()方法返回的值转换为List时遇到错误
使用HashMap的values()方法返回的值转换为List时遇到错误
|
5月前
包装类(Integer举例)
包装类(Integer举例)
|
JSON 数据格式
Gson转换json数据为HashMap时long类型变为double问题解决
今天再使用Gson处理json数据的时候碰到了一个问题 , 当我使用如下代码解析json数据的时候 , requestTime就变为了double类型
297 0
|
JavaScript
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
110 0
|
Java
Java:String.format实现double类型保留固定小数位
Java:String.format实现double类型保留固定小数位
163 0
Java基础String,int,Integer类型的互相转换
Java基础String,int,Integer类型的互相转换
Java基础String,int,Integer类型的互相转换
|
Java
Java数据类型中String、Integer、int相互间的转换
Java数据类型中String、Integer、int相互间的转换
197 0
Integer包装类特殊之处
Integer包装类特殊之处
71 0
|
编译器
Integer 对象的实例
Integer 对象的实例
88 0
|
缓存 Java API
为什么说两个 Integer 数值之间不建议使用 “==” 进行比较
众所周知阿里巴巴开发手册里面有一条强制的规则,说的是在包装类对象之间的值比较的时候需要使用 equals 方法,在 -128 和 127 之间的数值比较可以使用 ==,如下图所示。具体的原因相信大家都知道,虽然规则中提到 -128 和 127 之间的数值比较可以使用 ==,但是阿粉强烈建议你还是不要这样,包装类统一使用 equals,特别是如果有些数值是通过 API 或者 RPC 接口过来的,一定要注意。
为什么说两个 Integer 数值之间不建议使用 “==” 进行比较