一句话告诉你:java自动装箱 == 判定结果

近期面试发现很多公司出了些很坑爹的java 自动装箱类的==判定题,弄得很多求职者一头雾水

下面,由我来用一句告诉你们:java 自动装箱类型判定结果

int a = 127;
		int b  = 127;
		Integer c = new Integer(127);
		Integer c1 = 127;
		Integer d = 127;
		int e = 24657956;
		Integer f = new Integer(24657956);
		
		int g =  new Integer(127);
		int h = new Integer(127);
		
		System.out.println("a == b " +  (a == b));
		System.out.println("a == c " + (a == c));
		System.out.println("a == d " +  (a == d));
		System.out.println("e == f " + (e == f));
		System.out.println("c == d " +  (c == d));
		System.out.println("c1 == d " +  (c1 == d));
		System.out.println("g == h " +  (g == h));
输出结果为:

a == b true
a == c true
a == d true
e == f true
c == d false
c1 == d true
g == h true


结论:Java自动装箱/拆箱比较时,如果两个引用变量有一个为基本类型的引用变量,则==直接比较值(如e == f),当两个引用变量都为对象类型的引用变量时(如e == f),比较实例变量的内存地址值;

疑问:为什么c == d 为false,而c1 == d 为true?

解答:先解释为什么c1 == d为true;这是因为在JVM的方法区中有个包含-128~127Integer对象的数组,具体可以看Integer的私有静态内部类IntegerCache;默认情况下-128~127在一个static final 的数组里面,而直接声明Integer x =  num 同等于 Integer x = Integer.valueOf(num);而Integer.valueOf会先从这个缓存数组中取值,所以c1=127; d=127,两个127其实取的是同一个Integer对象,所以内存地址是相同的,指向的是同一个127;即c1 == d;

再来说说c == d 为什么=false;直接说根本原因:因为在Java中 new关键字会直接在堆内存中为某个对象申请一个内存空间,即这个实例对象的引用对象必定指向这个内存地址,所以c和d的内存地址必定不相同。

只要记住那句结论,面试这样的题目再也不是问题了!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值