注意听我说对“打包和拆包”的简单理解每章一点正能量:每当你想放弃的时候,想想自己坚持到现在是为了什么?序最近复习了Java基础中的一些知识点,发现了一些以前看过
注意听我说
对“打包和拆包”的简单理解
每章一点正能量:每当你想放弃的时候,想想自己坚持到现在是为了什么?
序
最近复习了Java基础中的一些知识点,发现了一些以前看过但没注意到的有趣的知识特性,比如这次要分享的Java中的一个常见特性:自动打包和解包。其实这个知识点和特点是我们在开发过程中经常遇到的。同时我们也会用到一些基本的数据类型或者封装的数据类型,但是一些特性比如它们之间的转换可能不是特别清楚。也可能出现在我们的采访中。本章部分从源代码解释了自动打包和解包的一些原理,以及会出现的一些陷阱的表现。有错误请及时指出~
本文已同步至GitHub/Gitee/微信官方账号,感兴趣的同学可以帮我们关注一下~
问题:
基本数据类型与封装数据类型有哪些区别?什么是装箱?什么是拆箱?装箱和拆箱都是如何实现的?使用时需要注意哪些问题?
1.基础知识复习
Java把内存划分成两种:一种是栈内存,另一种是堆内存。int是基本类型,直接存数值;而 Integer是类,产生对象时用一个引用指向这个对象。封装类位于java.lang包中。封装类是引用传递而基本类型是值传递基本类型的变量和对象的引用变量都是在函数的栈内存中分配 ,而实际的对象是在存储堆内存中
1.1基本数据类型和封装类型之间的区别
让我们来看看它们之间的区别:
区分
八种基本数据类型分别是:byte、char、boolean、int、short、float、double、long
对应的封装类型有:字节型、字符型、布尔型、整型、短整型、浮点型、双精度型和长型。
基本类型封装类型字节长度默认布尔布尔1假字节字节1 0 char字符2 u0000 short short 2 0 int整数4 0 long long 8 0l或0L float Float 4 0.0f或0.0F double Double 8 0.0
2." == "和" equal()"方法
巩固了上面的基础知识点之后,我们再来看另一个知识点“= =”和“equal()”,这两个知识点在比较基础数据类型和封装类型的时候会做一些事情。
" = = ":比较基本数据类型,比较它们的值。
“equals()”:比较指的是数据类型,根据不同的数据类型调用不同的equals方法。在特殊情况下,可以重写equals方法。
A==b不能判断A是否等于B,而是判断是否是同一个对象。如果要判断它们的价值应该怎么做?使用equal或objects . equals()(JDK 1.7之后的新语法)
Objects.equals有什么好处?
如果使用a.equals(b),如果a为null,还会抛出空指针异常。但是Objects.equals没有问题所以,我们在使用引用类型的时候,需要注意的是,赋值的时候,两个变量引用的是同一个对象。
我们以int和Integer为例,看看“= =”和“equal()”方法:
1)用“= =”运算符将基本类型和封装类型进行比较,封装类型会自动拆箱成基本类型再进行比较,所以Integer(0)会自动拆箱成int类型再进行比较。
2)比较两个整数类型“= =”。如果它们的值介于-128和127之间,则返回true,否则返回false。这和Integer.valueOf()的buffer对象有关,后面会讲到。
3)用equals()比较两种封装类型。首先,equals()比较类型。如果类型相同,继续比较值。如果值相同,则返回true。
4)基本封装类型调用equals(),但参数是基本类型。此时会先进行自动打包,将基本类型转换成它的封装类型,再进行3中的比较。
3.什么是打包和拆包?
原始数据类型的自动装箱和取消装箱是从J2SE 5.0开始提供的功能。根据Java语言规范,很多情况下,打包和解包都是由编译器自己完成的(这里的打包叫装箱,解包叫解包)。
通俗的理解:装箱:将基本类型转换成包类型的过程,解包:将包类型转换成基本类型的过程。上面介绍了八种基本类型和相应的封装类型。下面是Integer和int之间的转换:
3.1自动包装(自动装箱)
整数a = 2;//装箱简单理解:装箱2个,装箱的类型是整数。这个盒子里的值是2,我们已经完成了一次打包操作。把a指向盒子2。
整数b =新整数(2);//装箱显示装箱。生成一个新框new Integer();这个盒子的值是2。让B指向这个盒子。
3.2开箱(拆箱)
因此,我们的想法是将对象重新转换成基本数据类型。
int v = a . int value();//拆箱简单理解:把里面int的值拿出来。在执行操作时有一个典型的拆箱用法:由于对象不能直接操作,只能转换成基本数据类型后进行加减乘除。
例如:
整数c = 5;system . out . print(c-);//计算时隐含自动解包。4.打包和解包结合源代码分析。
通过第四点,我们知道了打包和拆包的基本概念知识。我们也以Integer为例,输入源代码看看里面的甘昆。
我们先来看看Integer的大小。
4.1整数大小
可以看出,它定义了整数的最大值为2 ^ 31-1,最小值为-2 ^ 31。整数的基本数据类型是int。
整数大小
4.2整数中的valueOf()方法
我们来看看Integer中的valueOf()方法。
整数中()的值
可以看出,valueOf()方法是一个静态方法。当传入的变量值在一个区间内时,直接用IntegerCache.cache[]数组中的数字返回,否则会创建一个新的对象。
让我们来看看IntegerCache类。其实也是会出现坑的地方。
4.3这里面有陷阱
那我们来说说整数里的一个坑,也是一个有意思的地方。
IntegerCache
初始化整数后,IntegerCache会缓存[-128,127]之间的数据。可以配置此间隔的上限,具体取决于属性Java . lang . integer . integer Cache . high,该属性在VM参数中设置为-XX:AutoBoxCacheMax=2000,或者在VM中设置为-DJ ava . lang . integer . integer Cache。因此,Integer在初始化完成后缓存[-128,max]之间的数据。Cache是一个常量,存储在java的方法区。
同样,在Long、Byte、Short中,我们也可以看到缓存,缓存数据长度是-128到127。这里没有展开。
其他陷阱:
比如:
system . out . println(integer . value of(null));Integer对象的值可以是null,所以编译器在检查的时候不会有异常,但是在转换成int的时候会抛出空指针异常。
4.实例分析
我们来看看一些经典的问题,看看你是否理解了打包和拆包的知识点。
new Integer(5) == 5?new Integer(5) == new Integer(5) ? Integer.valueOf(5) == Integer.valueOf(5)?Integer.valueOf(5).intValue() == 5?new Integer(5).equals(new Integer(5))?
4.1问题1:新整数(5) == 5?
回答:真的。等号左边是对象,右边是数值。物体和数值怎么可能相等?Java的编译器很聪明,它会自己做打包和解包操作。这里,它用新的整数(5)进行拆箱,并取出里面的值。这时候发现拿出来的5等于右边,所以是真的。
4.2问题2:新整数(5) ==新整数(5)?
答案:假的。New Integer(5)是创建一个新的盒子,这个盒子的值是5。= =是判断两个盒子是不是同一个盒子,而不是里面的值是否相同。所以是假的。因为它们不是同一个盒子。
4.3问题3:integer . value of(5)= = integer . value of(5)?
回答:真的。Integer.valueOf(5)它会返回一个盒子给我们,盒子里面的值是5。但是当这个盒子归还给我们时,可能会为我们建造一个新的盒子,或者为我们使用一个现有的盒子。所以integer . value of(5)= = integer . value of(5)。什么情况下会相等?仅当系统已经构建了盒子2并缓存它时。同时将框引用发送到等号的左边和右边。在这种情况下,它们将彼此相等。Integer.valueOf()是系统分配给我们的一个盒子。我们发现,每次调整我们的盒子,系统都给我们同样的盒子。我们的integer . value of(5)= = integer . value of(5)
然而:可能是假的。上面我们提到过,在low和high之间,它会返回一个系统已经产生的缓存,否则会产生一个新的。查看源代码,可以看到low = -128 high = 127。所以当它的值超出范围时,它会返回一个新的盒子,所以它会是false。
让我们试试200而不是5。
integer . value of(200)= = integer . value of(200)答案:假。说明系统将使用系统为小数字分配的盒子,系统将为大数字重新创建一个盒子。面试的时候,你可以回答,他们可能相等,也可能不相等。它是系统地确定的。
4.4问题4: integer.valueof (5)。intvalue () = = 5?
回答:真的。IntValue()做了一个拆箱操作,取出里面的值5。值5等于5,所以是真的。
4.5问题5:新整数(5)。equals(新整数(5))?
回答:真的。我们这里不用= =而是用equals。equals判断里面的值是否相等,而不是这个盒子是否相同,所以我们的答案是真的。让我们来看看equals的源代码。确定里面的值是否相等。
等于
打印结果:
打印结果
莫问
本章主要简单介绍自动装拆包的相关知识,希望对大家有所帮助~
以后我会在每章开头加一点正能量,结尾加五个编程相关的英语单词,学点英语。希望大家能和我一样,每天都积极向上,一起学习,一起进步!
学点英语
AWT(Abstract Window Toolkit)抽象窗口工具 API(Application Programming Interface)应用程序接口 AOP Aspect Oriented Programming(面向切面编程),可以 通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一 添加功能的一种技术。 BMP Bean-Managed Persistent(Bean管理的持久性),EJB中由 Bean自己负责持久性管理的方法,Bean的内容的同步(保存)需要自己编写代码 实现。 I18N internationalization(国际化),这个单词的长度是20,然后取 其首尾字母,中间省略的字母刚好18个。
欢迎关注微信官方账号:编码器编程
获取最新原创技术文章及相关免费学习资料,随时随地学习技术知识!
推荐阅读
一个带你通过TCP的“滑动窗口”协议。
向您展示连接在数据库中的用法。
向您展示group by在数据库中的用法。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/206662.html