前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解JAVA包装类、自动拆箱和装箱

详解JAVA包装类、自动拆箱和装箱

作者头像
Python进击者
发布2019-09-17 15:34:34
3840
发布2019-09-17 15:34:34
举报
文章被收录于专栏:JAVAandPython君JAVAandPython君

1

写在前面的话

终于有时间给大家来写篇技术推文啦!今天给大家来说说JAVA中的包装类以及自动拆箱和装箱的相关知识!这部分的内容其实也是很重要的,在一些面试题中这部分知识还是会涉及到的,所以大家也跟我来一起学习一下!

2

包装类是啥?

众所周知,JAVA是一门面向对象的编程语言,但是它真的就是完全的面向对象的吗?其实不然,在JAVA中有部分知识不是面向对象的,那就是我们经常使用的基本数据类型!

为什么需要有包装类这个东西呢?其实原因很简单,我们有时候是需要将一些基本数据类型当做一个对象来处理的,比如我们需要在list中添加一些基本数据类型的时候,我们直接通过list.add(100)来进行添加,这个时候其实就已经将基本数据类型转换成对象了。

那么包装类和基本数据类型的对应关系是怎样的?看下面↓

3

如何使用包装类呢?

首先包装类是位于java.lang包当中,那么这些包装类到底有什么用

• 提供:字符串、基本类型数据、对象之间互相转化的方式

• 包含每种基本数据类型的相关属性如最大值、最小值等

其实包装类当中的每个类中的方法都是类似的,我这里就以Integer这个类来做说明:

首先我们还是来看一看Integer这个类的源代码:

可以看到Integer继承于Number

看一下注释里面的解释,其实翻译过来就是将一个值包裹成一个类。

好了,我们非常简单粗暴的看了一下Integer的源代码,接下来我们实际操作一下吧!

例如下面这一句,这一行代码就是将“100”这个数包装成一个对象

代码语言:javascript
复制
Integer i = new Integer(100);

其实这句代码也可以这样写:

代码语言:javascript
复制
int t =100;
Integer i = new Integer(t);

其实就是将一个int基本数据类型包装成一个对象。

接下来,我们再来看一个方法 Integer.parseInt()

代码语言:javascript
复制
Integer in = Integer.parseInt("123456");

这个方法就是将一个String类型转化成一个int类型,非常实用的一个方法!

既然能把String类型转化成一个int类型,那么肯定也可以把int类型转化成一个String类型!

代码语言:javascript
复制
int t =100;
String tstr = Integer.toString(t);

但是,其实有个非常简单的方法也是可以将一个int类型转化成一个String类型。

代码语言:javascript
复制
String t1 = 234+"";

由于篇幅原因,我就只展示部分Integer中的方法,我建议大家可以去查看一下包装类中每个类的源代码,里面还有很多的方法,大家也可以去一一实现。

4

重头戏:自动装箱和拆箱 (auto boxing && boxing)

相信大家初次看到这两个词还是一脸懵逼,装箱?拆箱?其实非常的简单粗暴的。那么到底何为自动装箱?自动装箱就是基本类型自动地封装到与它相同类型的包装中,例如:

代码语言:javascript
复制
Integer tt = 100;

上面的代码就是自动装箱,从Java SE5开始就提供了自动装箱的特性,这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。

其实这行代码的背后还是有点故事的,它实际的代码是:

代码语言:javascript
复制
Integer tt = new Integer(100);

了解了一下自动装箱,那么自动拆箱是什么呢?顾名思义,跟装箱对应,就是自动将包装类转化成基本数据类型。

代码语言:javascript
复制
 Integer tt = 100; //装箱
 int ttint = tt;   //拆箱

其实编译器暗地里帮我们做了一些事:

代码语言:javascript
复制
new Integer(100).intValue();

它调用了Integer对象里的intValue()方法,为什么这么说呢?我们看一下测试代码:

代码语言:javascript
复制
Integer tt = null;//定义一个空对象
int ttint = tt;
System.out.println(ttint);

运行结果:

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
at demo1.main(demo1.java:9)

可以看到是报错的,为啥呢?因为我们把tt定义为了null,也就是说这是个空对象(也就是不存在这个对象),但是我们却使用了int ttint =tt,因为当我们写这行代码时,它就会去调用Integer中的方法,但是我们其实并没有真正创建这个对象,所以就报了空指针的错。

通过上面的一些代码,大家可能对装箱和拆箱有一定的了解了,其实从底层来看,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。这些方法我们都可以从源代码中查到。大家都可以去动手看一看!

我们继续深入一下包装类,看下面的代码:

代码语言:javascript
复制
Integer tt1 = 1234;
Integer tt2 = 1234;
System.out.println(tt1==tt2);
System.out.println(tt1.equals(tt2));

看一下输出结果:

代码语言:javascript
复制
false
true

一切表示很正常,但是不急!我们继续看下面:

代码语言:javascript
复制
Integer tt1 = 123; //改为123了
Integer tt2 = 123;
System.out.println(tt1==tt2);
System.out.println(tt1.equals(tt2));

输出结果:

代码语言:javascript
复制
true
true

为啥它就是true呢?我不是创建了两个对象了吗?应该是false啊?其实[-128-127]之间的数,仍然是当做基本数据类型处理的。为什么呢?其实是因为基本数据类型比对象快,jdk开发人员就是这样写的,我们也没办法。 大家把这个记住就行了!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python进击者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档