最近小康面试,突然被面试官问道,说一下Integer和int的区别。额…可能平时就知道写一些业务代码以及看一些自己觉得比较高大上的东西,包括面试也看的一些Spring源码等,对于这种java特别基础的东西反而忽略了,导致在面试的时候突然被问到这种基础类的题目反而不知道怎么回答了。哎,还是乖乖再看看底层基础,顺带记录一下把。另外给自己打个广告,楼主开发的文青乐园知识学习系统初步已搭建,大家可以体验,然后有问题随时提出来,点击文青乐园即可前往,后期也会将文章逐步迁移过去,欢迎大家试用。

基本概念(重要)

  • Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;
  • Integer 变量必须实例化后才能使用,而int变量不需要;
  • Integer 实际是对象的引用,当new一个 Integer时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值;
  • Integer的默认值是null,int的默认值是0。

拓展

基于以上的一些概念,这里我们拓展一下,对于Integer包装类型与int基本数据类型之间数值相互比较的结果进行一下说明,这个也可能在面试当中会被问到。

new Integer()与new Integer()的比较

下面的代码大家觉得结果是什么呢?大家可以先自己想一想然后再继续往下看。

public static boolean comp(){Integer i1=new Integer(10);Integer i2=new Integer(10);return i1==i2;}

Integer 变量必须实例化后才能使用,也就是我们必须new Integer()之后才可以使用,而我们知道,任何对象只要是new出来的都会放在堆内存中,同时该变量存储指向堆内存的地址,只要new出来的对象就是一个新对象,也就是说i1和i2指向的两个不同的对象,为了证明这一点,我们通过javap -v 看一下字节码,也能看的很清楚。

因为是两个不同的对象,所以上面的结果是false。

Integer与new Integer()的比较

再看下面的代码,Integer变量 和 new Integer() 变量比较

public static boolean comp1(){Integer i1=new Integer(10);Integer i2=10;return i1==i2;}

因为 Integer变量 指向的是 java 常量池中的对象,而 new Integer() 的变量指向堆中新建的对象,两者在内存中的地址不同,两者比较的话永远为 false。

Integer与Integer的比较

public static void comp2(){Integer i = 100;Integer j = 100;System.out.print(i == j);Integer m = 128;Integer n = 128;System.out.print(m == n);}

这里为什么会列举两个呢?大家往下看。
其实Integer i = 100 在编译时,会翻译成为 Integer i = Integer.valueOf(100),而 java 对 Integer类型的 valueOf 的定义如下:

这里的low和high分别为-128和127。

阅读源码我们可以很清晰的看到,java对于-128到127之间的数,会进行缓存,所以 当Integer i 的值在 -128到127之间时,会将值进行缓存,下次再取Integer j(值在 -128到127之间)时,就会直接从缓存中取,就不会new了,这样拿到的就是同一个对象。当Integer i 的值不在 -128到127之间时,每次都会重新new Integer(),那么每次都会是不同的对象。所以看到这里,大家应该知道上面的两个不同的比较的结果是什么了把,前者为true,后者为false。

int 变量 与 Integer、 new Integer() 比较

int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true,需要说明的是包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。

Integer i = new Integer(10); //自动拆箱为 int i=10; 此时,相当于两个int的比较
int j = 10;
System.out.print(i == j); //true

看完了以上的,大家看看下面的比较大家能否写出正确的结果。

public static void comp3(){int i = 128;Integer i2 = 128;Integer i3 = new Integer(128);System.out.println("i == i2 = " + (i == i2)); // Integer会自动拆箱为int,所以为trueSystem.out.println("i == i3 = " + (i == i3)); // true,理由同上Integer i4 = 127;// 编译时被翻译成:Integer i4 = Integer.valueOf(127);Integer i5 = 127;System.out.println("i4 == i5 = " + (i4 == i5));// trueInteger i6 = 128;Integer i7 = 128;System.out.println("i6 == i7 = " + (i6 == i7));// falseInteger i8 = new Integer(127);System.out.println("i5 == i8 = " + (i5 == i8)); // falseInteger i9 = new Integer(128);Integer i10 = new Integer(128);System.out.println("i9 == i10 = " + (i9 == i10)); // false}
public static void comp4(){Integer a = new Integer(127), b = new Integer(128);int c = 127, d = 128, dd = 128;Integer e = 127, ee = 127, f = 128, ff = 128;System.out.println(a == b); // false 因为a,b都是new出来的对象,地址不同所以为falseSystem.out.println(a == c); // true a会自动拆箱为int类型System.out.println(a == e); // false 指向的地址不同a是new出来的System.out.println(e == c); // true e会自动拆箱为int类型System.out.println(e == ee);// true Integer对 处于-128到127范围之间,指向了同一片地址区域System.out.println(b == f); // false 指向的地址不同b是new出来的System.out.println(f == d); // true f自动拆箱为int类型System.out.println(f == ff); /** false 指向的不是同一片地址区域。* 在Integer类型中,-128到127存放的是同一片区域地址,* 之外的数是另外开辟空间来进行 存储的*/System.out.println(d == dd); // true 不解释}
public static void comp5(){Integer i01 = 59;int i02 = 59;Integer i03 =Integer.valueOf(59);Integer i04 = new Integer(59);System.out.println(i01 == i02);//trueSystem.out.println(i01 == i03);//trueSystem.out.println(i03 == i04);//falseSystem.out.println(i02 == i04);//true}
public static void comp6(){Integer i01 = 128;int i02 = 128;Integer i03 = Integer.valueOf(128);Integer i04 = new Integer(128);System.out.println(i01 == i02);//trueSystem.out.println(i01 == i03);//falseSystem.out.println(i03 == i04);//falseSystem.out.println(i02 == i04);//true}

你知道Integer和int的区别吗相关推荐

  1. Java面试题15牛客 以下关于Integer与int的区别错误的是

    Java面试题15牛客 以下关于Integer与int的区别错误的是 A int是java提供的8种原始数据类型之一 B Integer是java为int提供的封装类 C int的默认值为0 D In ...

  2. Integer与int的区别

    如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...

  3. Integer 和 int 的区别

    一.int 和 Integer 的区别: Integer 是 int 的包装类,int 是 java 中的基本数据类型. Integer 对象必须是实例化后才能使用,而 int 变量不需要实例化. I ...

  4. Integer 与 Int 的区别

    Integer 类整形 与  Int 整形 的区别 最近在翻java的源码,发现了一些平常不注意,但很容易出错的东西,最近有空的话就整理出来. Integer:是一个int的包装类,Integer变量 ...

  5. java关于Integer和int的区别以及equals()方法

    Integer和int的比较详解 https://blog.csdn.net/andyzhaojianhui/article/details/84324466 equals()方法用于判断参数的类型和 ...

  6. Java基础 - Integer和int的区别

    一.int和Integer的区别 两者的区别主要体现在以下几个方面: 1.数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型: 2.默认值不同:int 的默认值是 0,而 Int ...

  7. integer比较_每日一题:Integer、int 的区别

    点击上方蓝色字体,选择"标星公众号"优质文章,第一时间送达来自 | chenxiangxiang链接 | cnblogs.com/cxxjohnson/p/10504840.htm ...

  8. Integer和int的区别

    1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...

  9. Integer 与 int 的区别

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类, Integer是java为 int 提供的封装类.int 的默认值为0,而 Integer 的默认值为 null,即 ...

最新文章

  1. Android的全屏活动?
  2. 有向图的拓扑排序的理解和简单实现(Java)
  3. Maven projects need to be imported反复弹出如何办?
  4. ABP文档 - Javascript Api - AJAX
  5. jms mysql_JMS学习九(ActiveMQ的消息持久化到Mysql数据库)
  6. 【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解
  7. Android之网络编程
  8. 双代号网络图基础算法_软考网络工程师之系统开发和运行基础(软件分类、测试、模型)...
  9. [转]Cuda笔记【1】GPU计算DEMO
  10. 看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)
  11. Codeforces Round #365 Div.2
  12. 锁失效_分布式锁的解决方案(二)
  13. 基于S3C2440A的DM9000A的调试笔记
  14. Redis 连接命令
  15. Cityscapes数据集gtFine部分介绍
  16. mysql查询数据库剩余空间大小_MySQL中查询所有数据库占用磁盘空间大小
  17. 游弋于太平洋,摆脱甜蜜的烦恼
  18. 单细胞分析:质控实操(五)
  19. 查询销量最高的产品mysql_MYSQL之——查询练习题
  20. 05 【动静分离和URLRewrite】

热门文章

  1. 07-Armv8-A virtualization
  2. 一图弄懂ARM中都有什么
  3. Gossip算法原理
  4. 【模拟】P1067 多项式输出
  5. 【dfs】P1036 选数
  6. 2020-11-10(安卓如何传递数据)
  7. 国内网络安全这门行业人才会不会饱和呢?
  8. 第 2 章:初出茅庐【初级篇 - 2.3 动态规划】
  9. linux之awk命令解读
  10. Spring boot的场景启动器