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

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

1写在前面的话          


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


2包装类是啥?          


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


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


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


image.png


3如何使用包装类呢?        


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


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

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


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


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


image.png


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


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


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


Integer i = new Integer(100);


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


int t =100;Integer i = new Integer(t);

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


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


Integer in = Integer.parseInt("123456");


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


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


int t =100;String tstr = Integer.toString(t);


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


String t1 = 234+"";


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


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


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


Integer tt = 100;


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


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


Integer tt = new Integer(100);


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


Integer tt = 100; //装箱 int ttint = tt;   //拆箱


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


new Integer(100).intValue();


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


Integer tt = null;//定义一个空对象int ttint = tt;System.out.println(ttint);


运行结果:


Exception in thread "main" java.lang.NullPointerExceptionat demo1.main(demo1.java:9)


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


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


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


Integer tt1 = 1234;Integer tt2 = 1234;System.out.println(tt1==tt2);System.out.println(tt1.equals(tt2));


看一下输出结果:


falsetrue


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


Integer tt1 = 123; //改为123了Integer tt2 = 123;System.out.println(tt1==tt2);System.out.println(tt1.equals(tt2));


输出结果:


truetrue


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


5结尾          

         

      在包装类和装箱、拆箱里面有许多的面试题,大家可以持续地关注公众号里的《那些你曾错过的JAVA题》专栏,有关于装箱和拆箱以及包装类,大家可以自己动手去实践一下,估计能够更好的掌握!

      如果你觉得这篇文章对你有所帮助,请点击右下角好看或者给JAP君加个小鸡腿支持一下!JAVAandPython君---一个坚持原创的公众号

相关文章
|
3月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
96 4
|
5月前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
63 9
Java——包装类和泛型
|
6月前
|
Java
【Java基础面试九】、说一说自动装箱、自动拆箱的应用场景
这篇文章介绍了Java中的自动装箱和自动拆箱概念:自动装箱允许将基本类型赋值给对应的包装类对象,而自动拆箱允许将包装类对象赋值给基本类型,从而简化了两者之间的转换过程。
【Java基础面试九】、说一说自动装箱、自动拆箱的应用场景
|
6月前
|
Java 程序员
【Java基础面试八】、为啥要有包装类?
这篇文章解释了Java中存在包装类的原因:为了让基本数据类型具备对象的特性,使得它们可以被用作对象,以符合Java"一切皆对象"的设计理念,并简化将基本数据类型作为Object类型参数传递的问题。
【Java基础面试八】、为啥要有包装类?
|
4月前
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
45 0
|
5月前
|
存储 Java 测试技术
Java零基础教学(10):包装类
【9月更文挑战第1天】Java零基础教学篇,手把手实践教学!
69 1
|
Java 缓存
Java——1个自动拆箱的例子
自以为对Java的装箱和拆箱很了解了。今天又人给我出了一道题,我一看就说 “不可能吧”。结果已运行真的能打印出“OK” 在if这一句断下来,然后F5。总共会调用4次intValue()。
990 0
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
6天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。

热门文章

最新文章