当前位置: 首页 / 技术分享 / 正文
好程序员Java培训分享int和Integer的区别

2020-08-05

Java培训 深圳Java培训

  好程序员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

  来看个例子

1

  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方法如下

2

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

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

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

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

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

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

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

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号