「数据结构」1.初识泛型

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

初识泛型

  • 🍉前言
  • 🍉包装类
    • 🍌装箱&拆箱
  • 🍉泛型
    • 🍌擦除机制
    • 🍌泛型的上界
  • 🍉泛型方法
    • 🍌类型推导

🍉前言

在Java中,泛型常常与数据结构一起使用,用来实现对不同类型的数据的增删查改,它使得数据结构更加通用和灵活,也实现了代码的复用。同时在编译时提供类型检查,避免运行时发生类型错误。而Java中现成的数据结构的源码也涉及到泛型……

泛型的重要性不言而喻,下面一起来了解一下吧!

🍉包装类

Java中基本类型不是继承自Object类,为了让泛型代码可以支持基本类型,Java给每个基本类型都对应了一个包装类型

基本数据类型包装类
intInteger
charCharacter
floatFloat
doubleDouble
booleanBoolean
  • 除了 int 和 char 类型,其他类型的包装类都是基本数据类型首字母大写
  • 包装类属于引用类型

🍌装箱&拆箱

装箱:将基本数据类型转换为对应的包装类对象
拆箱:包装类对象——基本数据类型

int a = 10;
Integer integer = a;  //装箱
System.out.println(integer);  //打印结果是10

我们会发现,这个过程编译器自动将基本数据类型转换为对应的包装类对象,这是自动装箱
我们也可以通过包装类的构造函数valueOf()方法来显式装箱(就是手动装箱)

int a = 10;
Integer integer = new Integer(a);Double d = Double.valueOf(20.0);// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int c = integer.intValue();

🍉泛型

JDK1.5引入泛型这个语法。通俗来说,泛型就是“适用于多种类型”
泛型的语法如下:

class 泛型类名称<类型形参列表> {//这里可以使用类型参数
}//可以有多个类型形参
class ClassName<T1, T2, ..., Tn> {//...
}

你会发现它的语法和定义方法很相似,只不过是现在是以类型作为形参
类名后的 <T> 代表占位符,表示当前类是一个泛型类

实现一个类,类中包含一个数组成员,数组可以存放任意类型的数据,也可以根据成员方法返回数组中某个下标的值

public class myArray<T> {public Object[] array = new Object[10];public void set(int pos,T val) {array[pos] = val;}public T get(int pos) {return (T)array[pos];  //把返回的类型强转为指定类型}
}

在创建数组对象的时候不能这么写:

public T[] array = new T[10];

注意:不能new泛型类型的数组
为什么呢?这与泛型编译过程中的擦除机制有关

🍌擦除机制

对于刚才上面的代码,我们通过命令javap -c 查看字节码文件
可以看到所有的T都是Object
在这里插入图片描述

擦除机制指的是:在编译的过程中,将所有的T替换为Object的机制
既然T在编译期间会被换为Object,那为什么还是不能写T呢?因为JVM规定不能这么写,它规定只能new Object类型的数组

所以,以后我们就这么写:

public Object[] array = new Object[10];

🍌泛型的上界

定义泛型类时,有时需要对传入的类型变量进行一定的约束,我们可以通过类型边界来约束:

class 泛型类名称<类型形参 extends 类型边界> {//...
}

比如:

public class MyArray<E extends Number> {//...
}

这里就限定了E的范围,E只能是Number本身或是Number的子类

还有一种形式,可以限定E一定是实现了某个接口的类:

public class MyArray<E extends Comparable<E>> {//...
}

比如上面这个泛型类,E一定是实现了Comparable接口的
下面展示一下这种形式的应用:

写一个泛型类,求一个数组中的最大值

思路分析:要求最大值,就涉及大小比较,而我们知道类是引用类型,要比较大小就需要用到之前讲过的compareTo方法,也就是说要实现Comparable接口

class Alg<T extends Comparable<T>> {public T findMaxValue(T[] array) {T max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}

🍉泛型方法

有可以适用于多种类型的泛型类,那自然也有适合多种类型的泛型方法
语法:

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

举个例子:写一个求最大值的泛型方法

public static <T extends Comparable<T>> T findMax(T[] array) {T max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;
}

🍌类型推导

类型推导指编译器根据传入的实参的参数类型推导出泛型方法中的类型参数
以刚才的求最大值方法为例:

public static void main(String[] args) {Integer[] array = {2,7,1,9,6,5};//数组中的元素自动转换为包装类对象int ret = Alg.findMax(array); //由array的类型推导得出T为IntegerSystem.out.println(ret);
}

我们也可以自己指定类型参数,不使用类型推导,只需在方法名前面加上<类型参数>就ok了

int ret1 = Alg.<Integer>findMax(array);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/443658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码实现 2.1.2、…

【云上建站】快速在云上构建个人网站3——网站选型和搭建

快速在云上构建个人网站3——网站选型和搭建 一、网站选型二、云市场镜像方式一&#xff1a;方式二&#xff1a;1. 进入ECS实例详情页面&#xff0c;点击停止&#xff0c;确保更换操作系统的之前ECS实例处于已停止状态&#xff0c;点击更换操作系统&#xff0c;进行镜像配置。2…

正则表达式 与文本三剑客(sed grep awk)

一&#xff0c;正则表达式 &#xff08;一&#xff09;正则表达式相关定义 1&#xff0c;正则表达式含义 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意…

能耗在线监测系统在节能管理中的应用

上海安科瑞电气股份有限公司 胡冠楠 咨询家&#xff1a;“Acrelhgn”&#xff0c;了解更多产品资讯 摘要&#xff1a;开展能耗在线监测系统建设&#xff0c;对加强政府部门和企业节能管理中的应用前景&#xff0c;分析系统在能源消费预测分析、能效对标、节能监察、能源精细化…

ChatGPT可与自定义GPTs一起使用,智能AI代理时代来啦!

1月31日凌晨&#xff0c;OpenAI在社交平台公布了一个超强新功能&#xff0c;可以在ChatGPT中输入“GPTs名字”的方法&#xff0c;调用多个自定义GPTs一起协同工作。 例如&#xff0c;我想开发一款社交APP&#xff0c;1&#xff09;可以先用专业分析GPTs做一下市场调研&#xf…

opencvb 十七 使用cmake配置opencv c++项目

1、cmake简介 1.1 cmake是什么 CMake是一个开源、跨平台的编译&#xff08;Build&#xff09;工具&#xff0c;是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件&#xff0c;能测试编译器所支持的C特…

云打印机怎么连接手机?

现在越来越多的人使用手机来办公或学习。而当我们需要打印文件时,如何用云打印机连接手机就非常重要了。易绘创云打印服务非常实用&#xff0c;那么易绘创云打印机又该怎么连接手机&#xff1f;下面就让我们一起来了解吧。 云打印机怎么连接手机&#xff1f; 当下云打印机连接…

opencv#40 图像细化

图像细化原理 作用&#xff1a;图像细化是将图像的线条从多像素宽度减少到单位像素宽度的过程&#xff0c;又被称为“骨架化”&#xff0c;删除像素点的标准&#xff1a; 通常情况下&#xff0c;我们使用二值化图像&#xff0c;我们在判断是否要删除某些像素点时&#xff0c;要…

基于YOLOv8的足球赛环境下足球目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

壹[1],Xamarin开发

1&#xff0c;环境 VS2022 注&#xff1a; 1&#xff0c;本来计划使用AndroidStudio&#xff0c;但是也是一堆莫名的配置让人搞得很神伤&#xff0c;还是回归C#。 2&#xff0c;MAUI操作类似&#xff0c;但是很多错误解来解去&#xff0c;且调试起来很卡。 3&#xff0c;最…

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意&#xff0c;爬虫技术不能滥用&#xff0c;干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问&#xff0c;无论是请求目标服务器的接口还是请求目标网页内容…