系列文章目录
文章目录
前言
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、包装类对象的缓存其实很简单,记一下原理这些,用多了就会了,没有我们想的那么复杂,一说到缓存就以为很复杂,并不是的