第四章Java包装类和泛型

在这里插入图片描述

  戳我跳到个人主页

  本人码云(建议pc端打开,手机可能会出现字体过小问题。)
  本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
  如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。

  本人后续会在这里更新操作系统和计组的笔记,敬请期待!
  有赞必回,评论必回,顺着网线回访!

Java包装类和泛型

包装类

包装类就是把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 Short Integer 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的类型可以相同,也可以不同
在这里插入图片描述

注意:在定义泛型对象时,只能使用类定义;基本类型不能保存到泛型中,对于基本数据类型,使用包装类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值