前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中Integer的详解

Java中Integer的详解

作者头像
付威
发布2020-01-21 17:36:52
1K0
发布2020-01-21 17:36:52
举报

在Java中有int和integer两种类型,简单的说Integer是int的引用类型,但是这个引用的类型比较特殊,下面看几个demo:

Integer a1 = 140;
Integer a2 = 140;
System.out.println(a1 == a2);

Integer b1 = 120;
Integer b2 = 120;
System.out.println(b1 == b2);

运行结果是:

false
true

原因: Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直节从缓存中拿取,不会再从新创建对象

所以120的时候地址是一样的,运行是true,大于127的时候重新开辟吗新的地址空间,地址不一致,为false

当然我们也可以强制重新开辟一个新的变量:

Integer c1 = new Integer(120);
Integer c2 = new Integer(120);
System.out.println(c1 == c2);


Integer d1 = new Integer(120);
Integer d2 =  120;
System.out.println(d1 == d2);

运行结果是:

false
false

这样就更好的验证了我们上面的想法。

如果用Integer和int的值相比,会怎么样呢?

Integer e1 = new Integer(120);
int e2 =  120;
System.out.println(e1 == e2);



Integer f1 = new Integer(140);
int f2 =  140;
System.out.println(f1 == f2);

Integer g1 = 120;
int g2 =  120;
System.out.println(g1 == g2);

运行结果是:

true
true
true

原因: 当Integer和int对比的时候,Integer会自动拆箱成为int进行对比

从上面的结论我们得出:

  1. Integer在小于-128到127可以看似是值类型,超过这个范围后,会变成引用类型
  2. Integer与int对比的时候会自动拆箱成int,再进行对比

综合上面,我开始有个一个疑问:

Integer i1 = 140;
Integer i2 = i1;
i1++;
System.out.println(i2);
System.out.println(i2 == i1);

运行结果是:

140
false

为什么i2没有随之i1的值改变而改变?

原因: Integer在进行运算的时候回自动调用内部函数intValue().

上面的代码可以拆解成:

Integer i1 = 140;
Integer i2 = i1;
i1=Integer.valueOf(i1.intValue()+1);
System.out.println(i2);
System.out.println(i2 == i1);

根据上面的所有情况,我们可以写一个终极的值类型和引用类型的转换:

Integer i1 = 120;
Integer i2 = i1;
Integer i3=i1+1;
Integer i4=i3-1;
System.out.println(i2);
System.out.println(i2 == i4);

运行结果:

120
true

而当i1=140的时候,i2 == i4就会变成false。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档