首先我们要明白Integer是引用数据类型,是包装类(封装类) 1.5版本之后,存在自动拆装包。他是int类型对应的封装类。

Integer是直接继承于Number类间接继承于Object类 ,实现了Comparable接口。

下面看实例:

Integer i1 = 10;Integer i2 = 10;Integer i3 = new Integer(10);Integer i4 = new Integer(10);System.out.println(i1 == i2);         //trueSystem.out.println(i1 == i3);        //falseSystem.out.println(i3 == i4);        //falseSystem.out.println(i1.equals(i2));        //trueSystem.out.println(i1.equals(i3));        //trueSystem.out.println(i3.equals(i4));        //true

而为什么又会出现下面这种情况呢?

Integer i1 = 1000;Integer i2 = 1000;Integer i3 = new Integer(1000);Integer i4 = new Integer(1000);System.out.println(i1 == i2);        //falseSystem.out.println(i1 == i3);        //falseSystem.out.println(i3 == i4);        //falseSystem.out.println(i1.equals(i2));        //trueSystem.out.println(i1.equals(i3));        //trueSystem.out.println(i3.equals(i4));        //true

原因:

这里我们要明白Integer类型的对象用"=="和用equals比较时的区别

==可以比较基本数据类型,也可以比较引用数据类型(变量中存储的内容),如果比较基本数据类型比较的时变量中存储的值,如果比较引用数据类型比较的时变量中存储的地址引用,equals()时Object类中继承过来的方法,每一个引用数据类型都可以调用。默认继承于Object类中的equals()方和==比较的一致,如果想要改变比较的规则,就需要重写equals方法,由于Integer类重写了equals()方法,所以Integer比较的数值。

下面分别是Object类中的equals方法和Integer类中的方法

Object类中的equals方法:

public boolean equals(Object obj) {return (this == obj);
}

Integer类中重写的equals方法:

public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;
}

还有就是考察了Integer类加载的时候,它就创建了自己的静态空间,立即加载了Integer类型的数组,数组内存储了256个Integer类型的对象-128 - 127,如果我们用的对象范围在这之内,如Ingeger i1 = 10;JVM就会直接从静态区的Integer类型的数组中直接找对应的对象,如果我们用的对象范围超出了这个,例如Integer i1 = 1000;JVM就会帮我们在堆内存中创建一个新的Integer对象。

如下便是Integer类中的内部类IntegerCache,就是该内部类类在静态空间中创建了Integer类型的静态数组cache[]。

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

源代码在Integer类中的780开始到812行结束。

总结:一定要明白==号比较基本类型比较的时值,比较引用类型比较的是地址,equals()方法是Object类中的方法,比较的时候一定要明白参与比较的类是否重写了equals()方法,重写后的比较规则是什么样的,引用数据类型的对象到底是创建在哪里的,万变不离其宗,掌握正确的比较规则,才能灵活的掌握这样中比较方式的区别。

感谢阅读,别忘了一键三连支持一下博主哟,谢谢~。

Integer i1 = 10;和Integer = new Integer(10);的区别相关推荐

  1. integer为null_走进 JDK 之 Integer

    文中相关源码: Integer.java 开发的越久,越能体会到基础知识的重要性.抽空捋一下 JDK 源码,权当查漏补缺.读完之后,你会发现 JDK 源码真的会给你很多惊喜. Integer 是基本类 ...

  2. integer 最大值_JAVA源码之Integer

    一.Integer结构 Integer继承Number类,实现Comparable接口 基本数据类型的包装类除了Character和Boolean没有继承Number外,其它的都继承了 Number ...

  3. integer为null_比较两个Integer,为什么必须使用equals?不用==

    equals和==的区别 对于基本类型,比如int.long,进行判等,只能使用==,比较的是直接值,因为基本类型的值 就是其数值. 对应用类型,比如Integer.Long和String,进行判等, ...

  4. java integer的默认值_int和Integer的默认值

    群里有一个小伙伴发了一段和下面差不多的代码啊,问了一个问题,代码如下: public static voidmain(String[] args) { doem01 doem01= newdoem01 ...

  5. Oracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262

    一. Bug 问题表现 2011年安装Oracle 10.2.0.4 和10.2.0.5 版本时,在配置OEM的时候会报错. 忽略这个错误后,DB 可以成功创建或者升级. MOS 上关于这个bug的说 ...

  6. oracle10G rac 10.2.0.1升级10.2.0.4

    前言 ocr版本查询指令:  ocrcheck vote盘路径查询指令: crsctl query css votedisk 相关指令参考来源:http://hzhg12345.blog.163.co ...

  7. int * * a[10] int * (*a)[10]和 int(*a[10])() 是什么意思

    int* (*a)[10]; a是一个指向包含10个int型指针元素的数组. 比如: #include <stdio.h>int main() {// 定义数组,包含10个int*int* ...

  8. 七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法...

    七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法 ====== ...

  9. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出

    10.10(Queue类)10.6节给出一个Stock类,设计一个名为Queue的类用于存储整数 题目 程序 破题 代码 Test10.java Test10_Queue.java UML 题目 程序 ...

最新文章

  1. angular 字符串转换成数字_蓝盟IT外包,Python算法的一般技术和嵌入式库|python|字符串|key|算法|调用...
  2. Windows未能启动,原因可能是最近更改了硬件或软件,解决此问题的步骤
  3. react怎么存上一页_【React】存储全局数据
  4. 我要自学网python视频教程_人生苦短,请用Python!学习Python的四大理由
  5. Java面向对象的三大特征(封装,继承,多态)
  6. FusionInsight MRS:你的大数据“管家”
  7. springCloud工作笔记090---SpringCloud_redis配置多数据源_redis多数据源
  8. 尴尬!Google搜索现在也会“千人千面”了,退出登录也一样
  9. 产品经理的方向感-产品生命周期
  10. 程序员面试金典——1.7清除行列
  11. 01,HelloWorld入门程序
  12. 修改服务器配额有什么坏处,云服务器配额调整
  13. IDEA修改快捷键方法(在原快捷键不变的基础上增加自己习惯的快捷键)
  14. win10系统怎样安装/更新独立显卡驱动
  15. macbook air恢复出厂设置
  16. 手把手教你git提交到码云(完整版)
  17. win7怎么显示后缀名
  18. 2018百度秋招一面/二面/三面
  19. 【STC单片机学习】第十三课:串口通信和RS485
  20. /usr/bin/yum: /usr/bin/python3.6.8: bad interpreter: No such file or directo

热门文章

  1. Imagemotion for Mac(PS动画插件)
  2. Java实现打印输出菱形
  3. 堆分配存储结构串的实现|C++
  4. ABAP-逻辑数据库
  5. pycharm配置可视化界面流程简介
  6. Python案例分析之客户信贷预测模型
  7. Android pm命令详解
  8. <update></update>
  9. 对于跨境电商系统的介绍
  10. UI设计—软件包装设计