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

2020-08-05

Java培训 深圳Java培训

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

  一、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默认值是0Integer默认值是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,为了加强对简单数字的重复利用。

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

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

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

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

  )

  内部类IntegerCache

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

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

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

  规定了low属性的值:-128

  来看个例子

1

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

  2c == 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

  IntegervalueOf方法如下

2

  4c == 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(北京)

    开班盛况
在线咨询
免费试听
入学教程
立即报名

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