【JavaSE基础】包装类全解析以及使用(详解装箱与拆箱)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

众所周知,我们Java语言的特性是面向对象。所以在Java中任何东西都是以类而存在的,但是我们的基本数据类型,却不属于类。在一些应用的场景下,它限制了我们的使用。比如我们无法使用Object里的方法呀(因为任何类都继承自Object)。无法参与转型,泛型,反射等使用。Java的开发人员为了弥补这个缺陷,于是为我们的八大数据类型各种设计了一个包装类,将基本数据类型和一些方法包封装起来成为保证类,下面是八大基本数据类型对应的包装类。除了int和char其他都是将头字母变为大写即可,其中我们用的最多的是Integer。

基本数据类型对应的包装类
byteByte
shortShort
int Integer
long Long
flortFlort
doubleDouble
charCharacter
booleanBoolean

🌞 2.什么是装箱与拆箱?

===============

在JavaSE5版本前,想要生成一个Integer对象,我们需要像大部分对象通过new调用构造方法来创建(手动实例化方法

Integer a=new Integer(10);

之后为了简化我们的书写,包装类对象的声明可以像基本数据类型一样进行直接的赋值使用,像下面即可(自动装箱方法)

Integer a=10;

在我们传入对应的基本数据类型后得到一个包装类对象,这个过程就是装箱,所以装箱简略而言就是将基本数据类型转化成引用类型**。**那什么是拆箱呢?和装箱相对而言,那拆箱就是将引用类型转化成基本数据类型

Integer a=10;//装箱

int x=a;//拆箱

装箱:基本数据类型转化为引用类型的过程

拆箱:引用类型转化为基本数据类型的过程

🌞 3.包装类的使用场景(重点)

=================

光明白包装类的拆箱与装箱却不了解使用场景,那我们学习了就毫无意义。下面为大家介绍一些常见的使用场景

🐱 1.字符串与基本数据类型的转换


在我们学习过程中,肯定遇到过这样一种情况,有一个纯数字的字符串,想将它变为int类型,却发现是不支持的,就像这样

String a=“1234567”;

int b=a;(错误的,Java是不支持的)

但是Integer提供却提供了将字符串转化为Integer的方法valueof()。在这个过程中是先将String转化为Integer,然后再拆箱成int类型,就像这样

String a=“1234567”;

int b= Integer.valueOf(a);

但其实我们将String转化为int时更常用的是parseInt()方法,它是将String当做一个十进制的整数解析。

String a=“1234567”;

int b= Integer.parseInt(a);

🌼**总结:**之所以要先讲valueof()是因为它先返回的是我们的包装类对象再变为基本数据类型,更加直观地体现出拆箱的过程。平时使用时还是推荐大家用parseInt()方法。这里只是以Integer为例。String也可以转换为其他基本数据类型,希望大家去了解和尝试。说不定哪天就遇上了需要转化的场景。

🐱 2.简化对基本数据类型的操作(进制转换)


我们都知道我们平时的整数都是十进制的,在某些情况下,比如做算法时,它可能需要我们转化为二进制、八进制、十六进制等等。有的同学居然去写一个非常复杂方法进行转换,这个问题Integer早就为我们想到了,提供了非常方便的方法。

public class Demo2 {

public static void main(String[] args) {

int a=100;

System.out.println(Integer.toBinaryString(a));//1100100 二进制

System.out.println(Integer.toOctalString(a));//144 八进制

System.out.println(Integer.toHexString(a));//64 十六进制

}

}

这时候肯定有人不服,你这些二八十六都是常见的进制,万一它要我转化什么三进制四进制五进制咋办?你还真别说,Integer还真不怕你杠,在Integer中重写了一个两参的toString方法。

参数i是你需要转化的数,参数radix是你需要转化的进制。我们直接来尝试使用一下

public static void main(String[] args) {

int a=100;

System.out.println(Integer.toString(a, 3)); //10201 将a转化为三进制

System.out.println(Integer.toString(a,4));//1210 将a转化为四进制

System.out.println(Integer.toString(a,5));//400 将a转化为五进制

}

🌼**总结:**到这你肯定已经感受到了包装类的强大了吧,它其实还有更多强大的功能,大家可以自己去jdk的文档了解。其他包装类的API使用较少,如果大家感兴趣的话也可以去了解一下。如果哪天能用上,那它一定能帮你解决不少的麻烦。

🌞 4.Integer的内存复用(常量池)

======================

☁️1.自动装箱的情况


我们都知道有一个字符串常量池这个东西,它以前在我们的方法区里,后面搬家去了堆上。Integer其实也有一个缓存常量池(其实包装类都有),但是这个常量池在哪我也不知道哈哈哈。在Integer类加载时,这个常量池就会先将**-128~127之间的数据缓存进常量池中。当你对Integer自动装箱赋值(还有手动实例的情况)**的值在这个区间时,它会自动从区间取出来引用给你。当你不在这个区间时,它会去堆上开辟新的空间来实例化对象。同样以例子说明

public static void main(String[] args) {

Integer a=10;

Integer b=10;

Integer c=129;

Integer d=129;

System.out.println(a==b);//true

System.out.println(c==d);//false

}

**答案为true的解析:**这样的答案在我们的意料之中,当你使用自动装箱的方式创建Integer对象时,会先判断你的值会否在-128~127的区间,如果在的话会直接将地址的值传回给你。这里a和b的值都在这个区间且相等,所以收到的地址是相等的,而==刚好是判断地址的所以第一个答案为true。

**答案为false的解析:**我们以同样的步骤分析,我们判断到c和d的值不在缓冲常量池的区间,这时候c和d就都要去堆上通过new实例化对象了。一人一片地址,==比较地址,两者地址不同当然返回false啦。

☁️2.手动实例化情况


之所以还要写这个是怕很多小伙伴忘记了或者分不清自动装箱和手动实例化的情况:

public static void main(String[] args) {

Integer a=10; //自动装箱得到Integer对象

Integer b=new Integer(10); //手动实例化Integer对象

}

如果我们结合上面两种答案的分析我们就能知道,当你自动装箱得到Integer时,它会去判断你的值是否在常量池中。在?ok那我把常量池对应的值地址给你,不在?那你老老实实去堆上new对象吧。当你直接通过new实例化对象时,那它可不管你的值是多少了,只要你敢new那就一定会在堆上重新开辟一片空间(压根不管你常量池)。

☁️3.Integer的正确比较方式


其实Integer的比较有点类似于字符串。**首先我们要知道==是比较地址,equals是比较字面值是否相等(别忘了每个类都有equals方法)。**所以当你只是想比较值两个Integer的值是否相等时,那你就应该使用equals,就像下面这个例子一样

public static void main(String[] args) {

Integer a=10;

Integer b=new Integer(10);

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

jwKAoZn-1713660934857)]

[外链图片转存中…(img-K4TXSyZa-1713660934858)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-bauUkkR3-1713660934858)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值