您好,登录后才能下订单哦!
本篇内容介绍了“java中为什么int==Integer为true”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
先看现象吧
执行下面的代码及输出结果:
int a = 1;Integer b = 1;Integer c = new Integer(1);System.out.println(a==b);//trueSystem.out.println(a==c);//trueSystem.out.println(b==c);//false
通常大家对此的解释是,==对于基本类型来说比较的是值,对于引用类型来说比较的是引用,即指向的对象的内存地址。这样解释没错,b==c结果为false毋庸置疑,因为两个都是引用类型。但是为什么a==b(a==c)一个是基本类型一个是引用类型,比较的时候还是值比较呢?
这个时候我们不妨把.java源文件编译后的.class文件使用反编译工具反编译成源码,看看虚拟机内部是如何处理a==b的。
.class文件使用jd-gui反编译后的:
int a = 1;Integer b = Integer.valueOf(1);Integer c = new Integer(1);System.out.println(a == b.intValue());System.out.println(a == c.intValue());System.out.println(b == c);
看到这想必大家都明白了吧,其实基本类型a和引用类型b比较时,引用类型b调用自身的intValue()方法获取Integer实际表示的int类型的值,即a == b.intValue()还是两个int类型的变量进行值比较。符合上述:==对于基本类型来说比较的是值,对于引用类型来说比较的是引用,即指向的对象的内存地址。
说到这,还要解释下为什么两个引用类型的值一样而引用不一样以及基本变量为什么是值比较。
其实基本变量int a在内存里只有一份,保存在栈(保存基本类型的变量数据及引用类型的引用)中,Integer b和Integer c中的int值都指向栈中同一个int,不会重新在栈中创建相同的int值。
而对于Integer b和Integer c,其实例是保存在堆(保存所有new出来的对象)中,虽然表示的int值相同,但是在堆中有两份,每次new都会在堆中开辟一片空间保存new的内容,故Integer b和Integer c分别在两片不同的内存空间存储,所以指向的内存地址不同。
而对于Integer b = 1;其反编译后为Integer b = Integer.valueOf(1); 而valueOf()方法内部是调用了new。
JDK中Integer.valueOf()源码:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
“java中为什么int==Integer为true”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。