Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:

原始类型:boolean,char,byte,short,int,long,float,double

包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

顺便一提,Java中的基本数据类型只有以上8个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。

所以最基本的一点区别是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。除此之外还有区别,请看代码:

public class TestInteger {
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
System.out.println(i == i3); //true,理由同上
Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
Integer i5 = 127;
System.out.println(i4 == i5);//true
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i6 == i7);//false
Integer i8 = new Integer(127);
System.out.println(i5 == i8); //false
Integer i9 = new Integer(128);
Integer i10 = new Integer(123);
System.out.println(i9 == i10); //false
}
}

  

为什么i4和i5比是true,而i6和i7比是false呢?关键就是看valueOf()函数了,这个函数对于-128到127之间的数,会进行缓存, Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以i4和i5比是true,而i6和i7比是false。

而对于后边的i5和i8,以及i9和i10,因为对象不一样,所以为false。

以上的情况总结如下:

1,无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。

2,两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

3,两个都是new出来的,都为false。还是内存地址不一样。

4,int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

最新文章

  1. Unity、c#中的拓展方法讲解
  2. 《好设计不简单Ⅱ:UI设计师必须了解的那些事》
  3. 第11章 System V 信号量
  4. 两款.net 下编辑器小结
  5. Android protectionLevel
  6. AJAX - 创建 XMLHttpRequest 对象
  7. JS学习笔记(二)运算符和流程控制语句
  8. Swift - 系统声音服务的使用(播放声音,提醒,震动)
  9. Java 类的热替换 —— 概念、设计与实现
  10. Bzoj4199:[NOI2015]品酒大会
  11. [LeetCode] Reorganize String 重构字符串
  12. J-Robot,能走、能跳舞的机器人
  13. BZOJ_1180_[CROATIAN2009]OTOCI_LCT
  14. IntelliJ IDEA 下载安装(含注册码)
  15. tensorflow输出
  16. Java八大排序算法
  17. 黑客专用操作系统——Kali Linux简介
  18. excel vba 数据分析
  19. MemSQL 架构初探
  20. React组件继承的由来

热门文章

  1. Linux之统计特定进程运行数量
  2. 【Html】网页获取屏幕宽高
  3. 高通 打开 wifi 驱动 log
  4. MongoDB C Driver Building on CentOS
  5. 第10章:awk进阶操作
  6. perl 查看某个模块的安装路径
  7. R语言colorRampPalette函数-创建颜色梯度(渐变色)
  8. C# IP地址与数字之间的互转
  9. Yii2 session的使用方法(2)
  10. 如何解析oracle执行计划