转自:

https://blog.csdn.net/xingkongdeasi/article/details/79618421

部分有所修改:

前言:

越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天天都在用,但是我今天没用详细弄清楚之前我也是不清楚,我们来看看这两个在用==号比较给我们带来的疑问。

先看看下面的代码,看看我们是否都会

@Test
public void testEquals() {
int int1 = 12;
int int2 = 12;

Integer integer1 = new Integer(12);
Integer integer2 = new Integer(12);
Integer integer3 = new Integer(127);

Integer a1 = 127;
Integer a2 = 127;

Integer a = 128;
Integer b = 128;

System.out.println("int1 == int2 -> " + (int1 == int2));
System.out.println("int1 == integer1 -> " + (int1 == integer1));
System.out.println("integer1 == integer2 -> " + (integer1 == integer2));
System.out.println("integer3 == a1 -> " + (integer3 == a1));
System.out.println("a1 == a2 -> " + (a1 == a2));
System.out.println("a == b -> " + (a == b));
}

答案是:
1、 int1 == int2 -> true
2、 int1 == integer1 -> true
3、 integer1 == integer2 -> false
4、 integer3 == a1 -> false
5、 a1 == a2 -> true
6、 a == b -> false
看看结果跟我们自己做的是不是都一样。

下面我们就来详细解释一下,为什么是上面的结果。(下面的序号就是对应的是上面的答案序号)

1、int1 == int2 为true,这个我就讲了,这个都知道

2、int1 == integer1,Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。

3、integer1 == integer2 -> false,这是两个都是对象类型,而且不会进行拆箱比较,所以不等

4、integer3 == a1 -> false , integer3是一个对象类型,而a1是一个常量它们存放内存的位置不一样,所以也不等,具体存在内存的位置看以看文章:点击打开链接

5、6   看起来是一模一样的为什么一个是true,一个是false,这是因为Integer作为常量时,对于-128到127之间的数,会进行缓存,也就是说int a1 = 127时,在范围之内,这个时候就存放在缓存中,当再创建a2时,java发现缓存中存在127这个数了,就直接取出来赋值给a2,所以a1 == a2的。当超过范围就是new Integer()来new一个对象了,所以a、b都是new Integer(128)出来的变量,所以它们不等。

根据以上总结:

①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。(要看具体位置,可以看看这篇文章:点击打开链接)

(Arnold备注:new Integer()必然是堆内存中新增数据,Integer 是java的常亮实现类,如果是在-128到127时则存在于常量池中,如果大于127,则在堆内存中新增对象,==比较的为内存地址,所以即使

new Integer() 和直接使用Integer 定义数据,都是在堆内存中存储的数据,则对应的内存地址也不会相同,所以,new Integer 于 Integer 必然不会相等)

②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。

③、两个都是new出来的,则为false。(备注:除了进入常量池的对象,在实例化前会去常量池中比较是否有相同的内容,相同则返回当前常量池的内存地址,其余进入堆内存空间的对象,一律是直接开辟空间进行堆内存的存储,不会进行是否已经存在的判断)

④、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。(备注:两个int 的比较操作,实际就是直接进行值的比较的操作)

(Arnold备注:方法区常量池的概念此处不再赘述,此处主要说明下,java中常量池对基本类型的一些实现:)

Java中实现常量池的基本类型的包装类分别是:String,Byte,Short,Integer,Long,Character,Boolean,浮点数的包装类型则没有实现,Byte,Short,Integer,Long,Character 五中类型

也只是在对应的值小于 127和-128时才会实现常量池,超出该值的范围则直接在堆内创建内存,于上述介绍的Integer的常量池一致,而对于String的常量池则和上面所提到的其他类型的常量池基本一致,

对于直接String =“”“” 来创建的对象数据则是直接存储在常量池中,没有大小和范围的限制,而对于直接 使用 new 的方式创建的对象,则都会直接放到堆内存中,此处于其余的常量池的实现类是一致的。

可参考如下链接:https://blog.csdn.net/qiaoijun/article/details/48878039

String s = "Java" 这种声明的方式。产生的这种"常量"就会被放到常量池,常量池是JVM的一块特殊的内存空间。
使用Java常量池技术,是为了方便快捷地创建某些对象,当你需要一个对象时候,就去这个池子里面找,找不到就在池子里面创建一个。但是必须注意 如果对象是用new 创建的。那么不管是什么对像,它是不会放到池子里的,而是向堆申请新的空间存储。
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型

转载于:https://www.cnblogs.com/zh94/p/9960719.html

Java Integer于Int 进行==双等于的内存比较时的一些问题说明相关推荐

  1. java integer int 比较_java Integer和int之间的比较问题是什么?

    展开全部 java Integer和int之间e68a84e8a2ad3231313335323631343130323136353331333365633864==的比较问题.求解释 public ...

  2. (备忘)Java数据类型中String、Integer、int相互间的转换

    1.Integer转换成int的方法 Integer i; int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Inte ...

  3. java中的int、Integer 和 new Integer()的区分和比较

    java中的int.Integer 和 new Integer()的区分和比较 一.问题提出: 1.1.问题一: int a = 2; Integer b = 2; Integer c = new I ...

  4. java中String,int,Integer,char、double类型转换

    java中String,int,Integer,char.double类型转换----https://www.cnblogs.com/kangyu222/p/5866025.html 转载于:http ...

  5. Java数据类型中String、Integer、int相互间的转换

    1.Integer转换成int的方法 Integer i;  int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Int ...

  6. JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...

  7. 二十八、Java中的Int和Integer的区别

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  8. Java黑皮书课后题第5章:**5.37(十进制转二进制)编写程序,提示用户输入一个十进制整数,然后显示对应的二进制值(不要使用Integer.toBinaryString(int)方法)

    5.37(十进制转二进制)编写程序,提示用户输入一个十进制整数,然后显示对应的二进制值 题目 题目概述 破题 代码 运行示例 题目 题目概述 5.37(十进制转二进制)编写程序,提示用户输入一个十进制 ...

  9. java中 int 比较_java中Integer与int的种种比较你知道多少?

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

最新文章

  1. 是北京晚报!不,是中国最大的讽刺!!!
  2. 谷歌AI乳腺癌检测超过人类?美国知名记者:让糟糕的医疗更糟罢了
  3. Web开发者用什么编辑器?
  4. Scala Akka的Actor模型
  5. web开发软件,HTML如何添加锚点,成功入职阿里
  6. 前端学习(2708):重读vue电商网站28之通过axios请求拦截器添加 token
  7. java学习(162):同步对象锁
  8. openid4java 使用记录[转载]
  9. pageControl设置不居中显示,居左或居右
  10. 解决sublime中文输入问题
  11. 5月全国程序员工资最新统计,网友:惊呆了!
  12. Mac BookPro 开机密码忘记解决办法
  13. 【解题报告】Kattis - adjoin 树形dp
  14. Centos7安装Docker并配置镜像加速器
  15. 顺序匹配网络:基于检索的聊天机器人中多回合响应选择的新架构
  16. 关于AIX上VMO调整参数的若干说明
  17. 学习周报20200216 | 学习计划安排整理
  18. 8051单片机Proteus仿真与开发实例-光敏电阻+ADC0804仿真
  19. Zabbix监控平台部署+监控客户端
  20. windows11 版本 business editions consumer editions 区别介绍

热门文章

  1. Asp.Net数据库编程-10条最优方法[翻译]
  2. 【转】X分钟速成c++
  3. HttpClient、OKhttp、RestTemplate对比
  4. C++其他进制转十进制
  5. Hi3516A开发--挂载SD卡和U盘
  6. hdu2110(普通母函数)
  7. java关联查询实战_MapReduce实战(五)实现关联查询
  8. 【译】 Diving Into The Ethereum VM Part 6 - How Solidity Events Are Implemented
  9. android WebView详解,常见漏洞详解和安全源码(下)
  10. 鸿蒙os实锤了吗,鸿蒙OS实锤了?8月9日华为开发者大会一同见证!