00016.01 包装类(涉及知识点C#中装箱与拆箱的原理也可以找到答案)

系列文章目录

前言

Java里面类的首字母要大写

一、包装类是什么?

1、为什么要有包装类?

因为Java是面向对象的编程语言, 但是Java发明时,是C语言盛行的时候,而且C语言确实很好用。特别是其中的8种基本数据类型,不管在存储还是运算都很强大。那么,Java就延续使用了C语言的8种基本数据类型。

8种基本数据类型不属于对象,Java后面在设计很多的API、新的特性(泛型等),不支持基本数据类型,只支持对象,Java就想了一个办法解决:为8种基本数据类型配上包装类。

2、包装类有哪些?

基本 包装类(java.lang)
byte --> Byte
short --> Short
int --> Integer
long --> Long
float --> Float
double --> Double
char --> Character
boolean --> Boolean
在这里插入图片描述
他们都存在于java.lang包里面
在这里插入图片描述

3、装箱与拆箱

装箱:把基本数据类型的数据 包装 称为包装类的对象
基本数据类型 -->包装类的对象

拆箱:把包装类的对象 拆解 称为基本数据类型的数据
包装类的对象 -->基本数据类型

JDK让程序员更简洁的去操作包装类,在JDK1.5引入了自动装箱与自动拆箱。在这个之前需要手动装箱与拆箱。
自动装箱:当把基本数据类型的值,赋值给包装类的变量时,就会自动装箱。
注意:自动装箱与拆箱都是只发生在对应类型上。

自动拆箱:把包装类的对象赋值给对应的基本数据类型的变量时,就会自动拆箱
注意:自动装箱与拆箱都是只发生在对应类型上。
我们看看怎么用
建一个单元测试@Test
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打印一下看看有什么区别
在这里插入图片描述
打印出来都是10
在这里插入图片描述
我们上面的操作是手动装箱,实际上代码是会自动装箱的
JDK让程序员更简洁的去操作包装类,在JDK1.5引入了自动装箱与自动拆箱
自动会转换
在这里插入图片描述
自动装箱与拆箱都是只发生在对应类型上,这句话怎么理解,看如下代码
在这里插入图片描述
因为Double不是int的包装类
在这里插入图片描述
拆箱演示:包装类 变成不是包装类 就叫拆箱

在这里插入图片描述
看下面的代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据我们之前的认知,我预测是 先拆箱 integer i i 变为 int 后再 自动转换为double 这样来进行比较
在这里插入图片描述
从上面的代码我们可以看出,一旦变为基本数据类型,那么就要考虑基本数据类型的自动类型转换或强制类型转换的问题了。

4、包装类的API

在这里插入图片描述
除了parseInt 可以进行转换,还有valueOf也可以转换
在这里插入图片描述

太多了,我们以其中一个为例,要学会自己查API
我们以Integer 为例
(1)把字符串转为 int 值

(1)把字符串转为int等基本数据类型的值

在这里插入图片描述
大家来猜一猜,我就先猜为敬了,根据我目前的认知呢,我觉得,可以转,不会报错,但是呢精度会丢失,也就是说123.05会变成123
好了,我们试试吧(强行加戏,试试就逝世)
恭喜我,答错了
在这里插入图片描述
小数,你只能转成double
在这里插入图片描述

①Integer.parseInt(xx)
②Integer.valueOf(xx)

int a = Integer.parseInt("123");

 double d = Double.parseDouble("123.05");

下面再来看看 valueOf
它得到之后是得到这个对象,但是你完全可以改
在这里插入图片描述
改成这样
在这里插入图片描述
因为它会自动拆箱,先转成Integer对象,后拆箱为int
同样的 double 也有 valueOf,
我们建议直接使用parseInt 一步到位

(2)进制转换

System.out.println(Integer.toBinaryString(10));//转为二进制
System.out.println(Integer.toOctalString(10));//转为八进制
System.out.println(Integer.toHexString(10));//转为十六进制

(3)常量值

MAX_VALUE
MIN_VALUE

不仅仅是·Byte有,全部数据类型都有,如果你在判断的时候想进行极限判断的话,就可以用到

在这里插入图片描述

(4)转大小写:Character

Character.toUpperCase(‘a’)
Character.toLowerCase(‘T’)
在这里插入图片描述

5、包装类对象的缓存问题

自动装箱这种情况。
在这里插入图片描述
猜测运行结果是什么?
再来猜一猜吧,虽然我已经没有信心了,我猜输出结果是false,因为他们不是一个对象

啊哈哈,我又开始意淫了
揭晓答案吧
在这里插入图片描述
为什么会这样呢?,并不科学啊
实际上它们比较的是地址值,只不过此时问题不在地址值这里,而在于包装类有缓存
Byte,Short,Integer,Long:都有缓存对象 -128~127
也就是说这四核类型 不能大于127 也不能小于-128
你看 改成127 没有超出范围就正常了
在这里插入图片描述
原理如下:
在这里插入图片描述
在这里插入图片描述

同理:
Float,Double没有缓存对象
Character:0~127 最早的ASCII码表的128个字符
Boolean:false,true (因为Boolean就两个,很容易缓存)

在这里插入图片描述
看这个世纪难题
在这里插入图片描述
为什么执行结果是false呢???
Float,Double没有缓存对象,意思就是永远都会创建新的对象,那么肯定不是一个对象
内部原理是 Double,不好缓存,毕竟精度太多了,1.0001,2.03、5.532000等等,不像Integer,所以Float,Double干脆就不给你缓存了
在这里插入图片描述
在这里插入图片描述

总结

1、装箱拆箱 可以结合C#学习,毕竟C#里面装箱拆箱之前一直说不清
2、包装类对象的缓存其实很简单,记一下原理这些,用多了就会了,没有我们想的那么复杂,一说到缓存就以为很复杂,并不是的


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值