Integer和Integer.valueOf()的比较分析

1.Integer和Integer.valueOf()的比较分析

Integer x = 394;
Integer x1 = Integer.valueOf("394");
if(x==x1){
    //执行代码      
}

如上面代码所示:我在做数据转换并进行比较时,前面一直没有报错,但是到后面突然报错,也是找了很多原因,debug时发现两个数值也是一样大,但是就是不相等,之后在百度上找出问题所在,再进行代码测试和查看源码,更加确定问题所在。
出现错误原因是测试时,因为数据值较大导致的:
(1) 当x=127,x1=127之前的数时,代码继续执行;
(2) 当x=128,x1=128之后的数时,报错;
出现这样的原因是:
当数据大于127时,Integer会在堆中重新new (开辟新空间)一个 Integer,存放数据,所以两个数据相等,但是地址不同,返回false.
综合上述:
所以整数值在 -128~127之间,解析的Integer是同一个对象,不再-128~127之间,数值相同,但地址不同。更加确切的明了,可以查看Integer的valueOf()方法源码。
解决方法:
(1) 将Integer.valueOf(“394”)换成int a = Integer.parseInt(“394”);
(2) 将“==”改成“equals”,equal比较两个对象的值。值相等返回true。

扩展1:Integer.valueOf()和Integer.parentInt()分析

Integer.valueOf("374");//是将字符串解析成Intger对象类型,返回的是Integer   
Integer.parseInt("374");//是将字符串解析成int基本类型,返回的是int
//执行以下代码比较
(1)System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));//true    
(2)System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));//false
(3)System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));//true

解释:
(1)Integer.valueOf(“127”)返回的是Integer对象,而且他们的数值也保持在-127~128之间,所以相等,返回true。
(2)跟上面(1)的恰好相反,Integer.valueOf(“128”)返回的是Integer对象,而且他们的数值没有在-127~128之间,所以返回false。
(3) Integer.parseInt(“128”)返回的是int基本类型,Integer.valueOf(“128”)返回的Integer对象,Integer会自动拆箱成int进行比较,比较的是两个数值,所以返回true。

扩展2:自动拆箱、自动装箱

上面提到自动拆箱,就在这简单的描述一下。
—-自动装箱:将基本数据类型转化为对象,例如声明一个Integer对象,Interger = 9;
—-自动拆箱:将对象转换成基本类型,如上图第三种代码比较所示:Integer对象会自动转换成int基本类型进行比较。

扩展3: 两个new对象进行比较时

Integer a = new Integer("13");
Integer a1 = new Integer("13");
System.out.println(a==a1);//false
System.out.println(a.equals(a1));//true

两个new对象比较时,每个new对象时,都会开辟新的空间,两个值进行“==”比较时,永远不会相等。

扩展4: New对象和Integer.valueOf()进行比较

Integer a = new Integer("100");
Integer a1 = Integer.valueOf("100");
System.out.println(a==a1);//false
System.out.println(a.equals(a1));//true

跟扩展3类似,因为Integer.valueOf(“100”)返回的是Integer对象,也就是两个对象进行比较,不管怎样值相等,但地址不同

扩展5:new对象和Integer.parseInt()进行比较

Integer a = new Integer("13");
int a1 = Integer.parseInt("13");
System.out.println(a==a1);//true
System.out.println(a.equals(a1));//true

Integer对象和int基本类型进行比较,不管怎样都相等。

总结:

以上是我对Integer之间比较的总结,花了几个小时时间,测试代码。有些地方可能理解的不够深刻,如错误,请指正,立即探讨找出错误,并修改。

猜你喜欢

转载自blog.csdn.net/qq_38236927/article/details/82080270