本人码云(建议pc端打开,手机可能会出现字体过小问题。)
本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。
本人后续会在这里更新操作系统和计组的笔记,敬请期待!
有赞必回,评论必回,顺着网线回访!
包装类
包装类就是把8大基本数据类型封装到类
当中。
Object类可以接收所有引用数据类型(数组,类,接口),为了让Object类可以接收Java中一切内容,引入包装类,把
基本数据类型的数值封装到类的对象
之中就产生了包装类。
关于基本数据类型的默认值,其实在很多场景下会造成误导,比如int型默认值就是0,但是如果我想保存的值就是0,无法判断此时是数据没有输入进去,使用了默认值,还是本来就输入了0,正确输入了。
但是引用数据类型的默认值就是null,就可以规避这个问题。
再比如,有一个扣费的需求,当前费用 * 当前费率(打几折)= 实际扣款数。
假如需要输入费用和费率,控制台输出实际扣款数。假设费率使用double类型,默认值0.0。计算时,如果出现了费率为0.0,你无法判断是你没有输入数据,自动使用默认值0.0了,还是这个需求确实是免费的。如果这个数据在第一个呢,那么后面的程序能否运行,会很麻烦。
如果使用的是double的包装类Double,默认值就是null,就不会出现这个问题。
JDK中的包装类 - 以下八种
数值型包装类(Number的子类):
- 整型 - byte < short < int < long
对应的包装类 - Byte ShortInteger
Long- 浮点型 - float < double
对应的包装类 - Float Double其他的包装类:
char型 -Character
boolean型 - Boolean
除了int和char的包装类不一样,其他的都是首字母大写。
包装类的使用
以整型为例:
int => Integer
Integer => int
装箱 boxing:将基本类型的数值保存到包装类对象中
。
拆箱 unboxing:将包装类对象中的数值还原为基本数据类型
。
自动拆装箱 ( autoboxing autounboxing )
=>使用包装类就和使用基本数据类型一模一样
自动拆装箱其实也是java的一个语法糖,在编译的时候,由编译器替我们做这些事,自己不用管 ~
有了自动拆装箱,使用包装类就和使用基本类型完全一致。
只有两个地方不一样:
默认值不同
,包装类的默认值都是null
,基本类型默认值每个都不一样,是各自的数据类型默认值。- 比较相等时,包装类仍然使用
equals方法
比较,所有类对象的比较都使用equals方法。
易错:
同字符串常量池,当使用整型包装类的自动拆装箱时,JVM会缓存相应的数值。对于Integer常量池,默认在-128到127之间的取值,都会缓存到常量池中。
如果写以下这两个,都将会是真。
其实,Character,Long他们都有常量池,不需要记这些关于==的东西,只需要记住,引用数据类型比较时,必须用equals方法即可。
阿里编码规范:所有POJO类(普通类)的成员变量一律使用包装类替代基本类型。
泛型
问题引入:
Point坐标类{
x;
y;
}
x = 10, y = 20;
x = 10.1, y = 20.5
x = “东经15度”, y = “北纬39度”;
假如我需要一个坐标类,其中,x和y都可以定义为任意数据类型,那么我该如何定义这个类呢?
Java强类型语言,在定义x和y时必须强制定义变量类型,那么,它们应该被定义成什么类型呢?
将x和y定义为Object类型
Point类
测验这个类是否可以先设置坐标,然后再取出相应的坐标
整型可以
好像没什么问题,String也可以
哦哦哦,因为这个坐标是用户输入的,用户不能保证每一次输入的x和y的类型都一致
在Java程序中,我们一般要求,把所有的错误都提前暴露在编译阶段,程序还没跑起来就能发现错误,这是最好的。
为了解决上述的问题,我们引入了泛型。
泛型 - 作为守门员,泛型是一种编译阶段检查类型是否一致
的手段。
所谓的泛型指的是在类定义时不明确类型,在使用时明确类型。
这是一个泛型类
<>中可以使用任何字符,甚至中文,规范写,都是单个的大写字母
常见的泛型类型参数
T:表示任意类型
K:键值对的key值
V:键值对的value值
E:表示单个元素
如何使用泛型
可以发现,之前设置的Setter方法中的T类型,现在已经变成String类型了
人为输入,有可能会输入错误的数据
哈哈,这个很方便
即
小结:泛型不仅可以在编译阶段检查设置的类型是否正确
,若不一致,编译就会报错,而且还可以在需要取出值时,还不需要强制类型转换
。
而且,当我们有了泛型之后,我们就可以使用泛型来改造我们的动态数组和链表,之前保存的是int,现在有了泛型,我们可以保存任意类型。
若泛型类中存在多个类型参数,如何使用
产生对象时,T和E的类型可以相同,也可以不同
注意:在定义泛型对象时,只能使用类定义;基本类型不能保存到泛型中,对于基本数据类型,使用包装类。