Integer包装类比较时“==”和equals()的区别及原因

来源:互联网 发布:ec6108v9怎么安装软件 编辑:程序博客网 时间:2024/06/07 00:42

先看一段代码:

Integer  i1  =  125;

Integer  i2  =  125;

System.out.println( i1 == i2);     //结果为true。

System.out.println( i1.equals(i2) );      // 结果也是true。

Integer i5 = 128;
Integer i6 = 128;
System.out.println( i5 == i6);           //结果却是false。

System.out.println( i5.equals(i6) );        //结果为true。

都是使用的“==”操作符,为什么两者的情况不同呢?

我们都知道,equals()方法针对引用类型数据,比较的是两个对象的引用所指的内容(在堆中开辟的两个空间的内容)是否相等,而"=="比较的是两个对象引用的地址值或者两个变量的数值(存放于栈中的内容)是否相等。

Integer i1 = 125;实际上可以看成是Integer  i1 =  Integer.Valueof(125);而在Integer的源码中(按住ctrl左击查看),已经在内存中准备好了一些数值,当需实例化一个新的Integer对象时,会先去缓存中检查是否有这个数值,有就直接返回该数值,没有就需要new出来。而缓存好的数值是有范围的,在-128到127之间。源代码如下:


原创粉丝点击