基本概念的区分

1、Integer 是 int 的包装类,int 则是 java 的一种基本数据类型

2、Integer 变量必须实例化后才能使用,而int变量不需要

3、Integer 实际是对象的引用,当new一个 Integer时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值

4、Integer的默认值是null,int的默认值是0

Integer、new Integer() 和 int 的比较

1、两个 new Integer() 变量比较 ,永远是 false 因为new生成的是两个对象,其内存地址不同

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j);  //false

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

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j);  //false

3、两个Integer 变量比较,如果两个变量的值在区间-128到127 之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为 false 。

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //trueInteger i = 128;
Integer j = 128;
System.out.print(i == j); //false

分析:Integer i = 100 在编译时,会翻译成为 Integer i = Integer.valueOf(100),而 java 对 Integer类型的 valueOf 的定义如下:

public static Integer valueOf(int i){assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high){return IntegerCache.cache[i + (-IntegerCache.low)];}return new Integer(i);
}

java对于-128到127之间的数,会进行缓存。所以 Integer i = 127 时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

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

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

示例1

public class IntegerDemo {public static void main(String[] args) {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}
}

答案是

i == i2 = true
i == i3 = true
i4 == i5 = true
i6 == i7 = false
i5 == i8 = false
i9 == i10 = false

示例2

package demo1.demo1;public class Campare {public static void main(String[] args) {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 不解释}
}

示例3

Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59);

以下输出结果为false的是:

System.out.println(i01== i02);
System.out.println(i01== i03);
System.out.println(i03== i04);
System.out.println(i02== i04);

解析:

  • i01 == i02 。i01.intValue()i02 两个值的比较5959 -->true;
  • i01 == i03 。由于 59在-128到127之间,所以,i01和i03的赋值操作返回的是同一个对象。都是从chche中返回的同一个对象,对象地址相同 true;
  • i03 == i04。i03是来自缓存值,i04是新new的对象 ,二者不是同一个对象,所以false。
  • i02 == i04。和第一个类似,true。

答案是 C 。

示例4:与示例3的唯一不同,就是将值全部改成128

Integer i01 = 128;
int i02 = 128;
Integer i03 = Integer.valueOf(128);
Integer i04 = new Integer(128);

以下输出结果为false的是:

System.out.println(i01 == i02);
System.out.println(i01 == i03);
System.out.println(i03 == i04);
System.out.println(i02 == i04);

答案:

true
false
false
true



integer比较_傻傻分不清?Integer、new Integer() 和 int 的面试题相关推荐

  1. 动词ing基本用法_如果实在分不清英语动名词和现在分词,那就直接学习-ing分词...

    作者:保研的YOYO君 字数:3080字 YOYO君最近在网上看到一个有趣的英语小问题,"go swimming"这个词组中的swimming是个什么形式?动名词还是现在分词? 小 ...

  2. 国防大学计算机学院,国防大学和国防科技大学是同一所学校吗?很多人傻傻都分不清!...

    国防大学和国防科技大学,这两所大学名字相近,极易混淆,在很多网站搜索"国防大学录取分数线",出来的全是国防科技大学的的高考录取分数线,所以给广大考生带来了很大困惑,难道国防大学和国 ...

  3. cdn厂商 同兴万点_同兴万点:TXNetworks和CDNetworks让我们傻傻分不清

    原标题:同兴万点:TXNetworks和CDNetworks让我们傻傻分不清 在2008年2月25日成立的同兴万点,公司全称为同兴万点(北京)网络技术有限公司(TXNetworks),一直专注于CDN ...

  4. 2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...

    在日常生活中,很多时候会把某些电子产品的容量说成内存,或者把内存说成了容量.比如有人问:"这个手机的内存多大?"或许会有这样回答的:"内存是256G."这种问答 ...

  5. python陆股通_沪股通、深股通、港股通、陆股通都是什么鬼?傻傻分不清

    一谈到资金流向,我们经常会在各种财经报道和节目中,听到沪股通.深股通.港股通.陆股通等等名词,这对于很多没有买过港股的内地投资者来说,通常都是一脸懵,听名字好像有点明白,但四兄弟放在一起还真有点傻傻分 ...

  6. 潜龙号开启水下机器人_蛟龙、海龙、潜龙傻傻分不清?全面解密国内最先进水下机器人...

    原标题:蛟龙.海龙.潜龙傻傻分不清?全面解密国内最先进水下机器人 正在执行中国大洋49航次业务化调查任务的"向阳红10号"带上了一件探海利器--潜龙二号.它是我国自主研发的4500 ...

  7. Executor 与 ExecutorService 和 Executors 傻傻分不清

    转载自  Executor 与 ExecutorService 和 Executors 傻傻分不清 java.util.concurrent.Executor, java.util.concurren ...

  8. 国家电网和南方电网还傻傻分不清?

    参看:都2020年了,国家电网和南方电网还傻傻分不清? 一.名称不同 一个叫南方电网,一个叫国家电力电网,虽然都是电网,但是区别还是很大的 而且成立时间不一样:国家电力电网有限公司成立于2002年12 ...

  9. 数据平台、大数据平台、数据中台……傻傻分不清?这次终于有人讲明白了!

    来源 | 智领云科技 造概念,在IT行业可不是一件陌生的事儿,中文博大精深,新名词.新概念往往简单准确,既可以被大众接受,又可以被专家把玩,真正做到雅俗共赏.各有趣味.近年来,数据中台之火爆,什么数据 ...

最新文章

  1. mysql被拖垮_说几个拖垮系统的小细节!
  2. android 代码设置inputtype,android – 如何正确设置EditText的InputType?
  3. Log4Net五步走
  4. 最优非对称加密填充(OAEP)
  5. Python中使用推导式创建序列
  6. 禁用JavaScript之后,你的网站表现如何?
  7. Handler与多线程
  8. Linux 进程管理数据结构
  9. php 物联网应用,蜂窝物联网的概念以及应用
  10. Stop Googling!
  11. Spring中的Aop底层原理
  12. Windows核心编程学习笔记
  13. 程序员编程艺术:第三章续、Top K算法问题的实现
  14. 关于url传参中文乱码问题
  15. yum安装Apache Web Server后各个文件存放位置
  16. 高数七重积分的总结_高数下册总结
  17. Vuex2.0小米便签项目实例
  18. 三张图片无缝合成一张图片_在PS中如何将两张图片无缝拼接?
  19. 经方的魅力第二版》读书摘录
  20. 超实用!!MySQL数据库——Amoeba读写分离

热门文章

  1. SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
  2. canny边缘检测 关于2个阈值参数
  3. Angular使用@Input和@Output实现父子组件互相传参(类似Vue的props和this.emit)
  4. 在Ubuntu 16.04.3 LTS上玩转QUIC开源项目proto-quic
  5. 三维地形制作软件 World Machine 基础入门学习教程
  6. 使用Blender中的几何节点创建程序对象
  7. CG游戏道具全流程制作视频教程 Artstation – Stylized Game Asset
  8. Linux文件系统:概览(思维导图)
  9. Python学习心得第一周-03练习2
  10. Oracle Spatial构建自定义投影坐标系