温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

好程序员Java培训分享int和Integer的区别

发布时间:2020-08-14 13:03:15 来源:ITPUB博客 阅读:147 作者:好程序员 栏目:编程语言

   好程序员Java 培训分享int Integer 的区别, 在说int Integer 的区别之前,先要弄清楚两个问题:

  一、Java基本数据类型及其封装类

  二、Java自动拆箱和自动装箱

  Java自动拆箱和自动装箱

  1 、自动装箱

  自动装箱其实就是将基本数据类型转换为引用数据类型(对象)

  2 、自动拆箱

  自动拆箱其实就是将引用数据类型转化为基本数据类型

  int  和  Integer 的区别

  分析

  int

  Integer

  int  与  Integer  的区别

   相同值下的 int  和  Integer  的比较结果

  分析

  int

  int  Java的基本数据类型。

  Integer

  Integer  继承了 Object 类,是对象类型,是  int  的包装类。

  int  与  Integer  的区别

  值的存储

  int  存储在栈中

  Integer  对象的引用存储在栈空间中,对象的数据存储在堆空间中。

  初始化

  int  初始化值为 0

  Integer  初始化值为 null

  传参

  int  是值传递,栈中的数据不可变。

  Integer  对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。

  泛型支持

   泛型不支持int ,但是支持 Integer

  运算

  int  可以直接做运算,是类的特性。

  Integer  的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型 int

  int 是基本数据类型, Integer 是引用数据类型;

  int 默认值是 0 Integer 默认值是 null

  int 类型直接存储数值, Integer 需要实例化对象,指向对象的地址。

   相同值下的 int  和  Integer  的比较结果

   两个通过new 生成的变量,结果为 false

  int  和  Integer  的值比较,若两者的值相等,则为 true

   (注意:在比较时,Integer 会自动拆箱为 int 类型,然后再做比较。)

  new  生成的 Integer 变量 和 非 new  生成的 Integer 变量比较,,结果为 false

   (注意:new  生成的 Integer 变量的值在堆空间中,非 new  生成的 Integer 变量的值在在常量池中。)

   (注意:非new 生成的 Integer 变量,会先判断常量池中是否有该对象,若有则共享,若无则在常量池中放入该对象;也叫享元模式,后面再说。)

   两个非new  生成的 Integer 对象比较,则结果为 true

   (注意:此处需要一个前提:值的范围在 -128 ~ 127  之间。

  涉及到Java  int  与  Integer  的自动装箱和拆箱的一种模式:享元模式— flyweight ,为了加强对简单数字的重复利用。

   在赋值时,其实是执行了Integer valueOf() 方法。

   当值在 -128 ~ 127 之间时,Java 会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer 的内部类 IntegerCache 来完成的。

   当值超出此范围,会在堆中new 出一个对象来存储。

  PS :自动装箱与拆箱是在 JDK1.5 中出现的。

  )

   内部类IntegerCache

  通过此类可以缓存简单数字。

   缓存的数大小可以由 -XX AutoBoxCacheMax =  控制。

  jvm 初始化时,Java.lang.Integer.IntegerCache.high 属性可以设置并保存在私有系统属性中。

   规定了low 属性的值: -128

  来看个例子

好程序员Java培训分享int和Integer的区别

  1 a == b  吗? 废话,肯定不相等。两个 new 出来的对象地址不一样。

  2 c == d  吗? 这个也是废话,都是基本数据类型的值肯定相等。

  3 :现在的关键问题是  e == f  吗?  g == h  吗?

   答案是:e == f; g != h 。为什么会出现这种情况 ? 因为 ava 在进行编译时  Integer g = 130 会被编译成  Integer.valueOf(130)  ,这个可以通过反编译 class 文件看到。而通过 Integer 源码可以得出, Integer.valueOf()  方法会在数值 -128~127 之间会对 Integer 进行缓存,不会再重新 new 一个,所以  e==f  ;当数值二大于 127 或者小于 -128 的时候则会重新 new 一个,所以 g != h 

  Integer valueOf 方法如下

好程序员Java培训分享int和Integer的区别

  4 c == e  吗,  i == j  吗?

  答案都是相等的。因为封装类和基本数据类型进行比较的时候,Java 会自动拆箱,然后比较数值是  否相等。

  综上,我们可以得出几个结论:

  1 、都是封装类,都是 new 出来的,肯定不相等。因为对象的内存地址不一样。

  2 、都是封装类,都不是 new 出来的,如果值在 -128~127 之间,那就相等,否则不相等。

  3 、如果是封装类和基本类型进行比较,只要数值相等那就相等,否则就不相等。因为封装类和基本数据类型进行比较的时候会有一个自动拆箱操作。

  4 、都是基本数据类型,如果数值相等,那就相等;否则不相等。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI