java中基本数据类型自动装箱拆箱及其源码分析

java中有8中基本数据类型,他们可以不用在堆中创建对象,而是可以直接在栈中分配内存,像c语言和计算机系统里面一样,可以直接通过变量访问,而不用通过引用间接引用实例对象。这8中基本数据类型分别是:

boolean
byte
short
int
long
char
double
float

虽说这样挺好的,节约了内存,但是有一些方法也不能够实现,因为它已经不是一个对象了,而是一个单纯的数据了,比如Object所有的方法都不能够实现,而且在一些List或者其他集合里面不能使用泛型:List,因为List这个泛型是要使用Object或者它的子类,作为泛型传入,但是对于基本数据类型却无法使用了。那么对于基本数据类型,就引入了他们的包装类

boolean-------------------------------Boolean
byte------------------------------------Byte
short-----------------------------------Short
int --------------------------------------Integer
long------------------------------------Long
char------------------------------------Character
double--------------------------------Double
float------------------------------------Float
除了int和char外,其他都是把首字母改成大写

其实吧,包装类其实早就引入,不然那些方法怎么用,但是想一想,如果对于这种

Integer a = new Integer(2);

由于对象不能够直接相加,必须将其转成int型,实际是调用了intValue方法,将Integer包装的int值拉出来,再相加,那么这样增加了代码量,又非常麻烦,于是再jdk1.5加入了一个新特性,就是自动拆箱和装箱

自动拆箱:就是将对象类型拆成基本数据类型

自动装箱:就是将基本数据类型包装成对象

拆箱其实就是调用了XXXValue方法,比如Integer类型,就是调用了intValue方法,而装箱就是调用了ValueOf(XXX),比如Integer类型就是调用了Valueof(int x);

源码分析–以Integer为例


在这里插入图片描述

这个就是int型的最小值和最大值

在这里插入图片描述

自动拆装箱的方法调用

value是Integer包装的值
在这里插入图片描述
在这里插入图片描述
这个自动拆包装的方法。
其中valueof是将int型转成Integer
而intValue是将Integer转成int
这样我们创建一个Integer对象可以直接这样
Integer i = 3;他会自动调用valueOf将其包装成对象

valueOf

这里的valueof涉及到了一个IntegerCache类,这是啥呢,我们来跟进源码看看。
在这里插入图片描述
所以说呢,这个cache的缓存数组就是将byte范围的数据-128~127的值全部包装,并存储在cache中,然后我们看这个图片
在这里插入图片描述
它的意思是,如果需要包装的时候,这个值再-128~127的范围内,那么就直接返回这个缓存数组中的对应实例Integer对象,但是如果这个值不在这个范围内,就会重新new一个Integer对象进行包装。
这样就节约了内存,不用一只重新创建对象。

有了这个原理,那么来看看几道题目

在这里插入图片描述
==符号很冥想,和String一样,它比较的是对象地址,这里是Integer对象,所以不相等
而equals方法就是直接比较里面的值,其中equals方法是:
在这里插入图片描述
它相当于直接将两者拆箱比较了

在这里插入图片描述

这里Integer a
=3;就是将3自动装箱了,但是这里注意的是,还记得那个Valueof的自动装箱原理,如果再byte类型范围内直接使用cache的缓存数组的3的包装对象,不用重新创建的。
而int b=3就是再栈中分配空间了。 而在执行a == 3和a == b时就是自动拆箱了,再去比较
同理c<d也是将两者拆箱,只有==是比较对象的。

在这里插入图片描述
这里输出为true,很显然就是3和4都是在byte范围内,在包装时,不会重新创建一个Integer对象 比如 Integer a =
127; Integer b = 127; 这两个对象时相等的。 但是看着这种
在这里插入图片描述
由于128已经大于了byte范围,不能够使用缓存数组里面的内容,只能是自己重新创建对象,相当于new
Integer,这样i1肯定不等于i2的,这就是Integer需要注意的地方。


String 和 Int互相转换


String->Int

在这里插入图片描述

Integer方法里面有两个方法,将String转成Int,一种是直接默认转成十进制,而两个参数则是转成对应的进制。

Int->String

使用 + ""
任何一个整型连接字符串,整型都会转为字符串,这里连接一个空串是转换整型的最简单方法。当不需要转换非十进制字串时,推荐使用这个方式转换。
public static void intToString(){
int intNum = 1357;
String s = intNum + “”;
System.out.println(s); }

使用Integer.toString
直接调用Integer的toString方法可以将int转换成String
在这里插入图片描述

上面所说的我个人觉得非常重要,特别记住自动拆装箱是jdk5后加入的重要新特性,还有在自动拆装箱的所要注意的点,都是非常容易引起编程错误的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满锅lock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值