「数据结构」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为Integer
    System.out.println(ret);
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拒绝单调,Focussend智能AI助阵邮件营销,让打开率大幅提升

在互联网时代&#xff0c;邮件营销成为了企业推广产品和服务的一把重要利器。但是&#xff0c;面对大量垃圾邮件和用户审美疲劳&#xff0c;如何让你的邮件脱颖而出&#xff0c;成为了每一个市场人的头疼问题。光靠无聊的标题和内容可不行&#xff0c;得有点新花样。 搜索&…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统&#xff0c;它基于Windows XP/Windows NT 5.1进行开发&#xff0c;并在同年4月底上市。以下是关于Windows Server 2003的详细介绍&#xff1a; 系统名称与发布历程&#xff1a; 该产品最初被命名为…

linux vim 异常退出 异常处理 交换文件

交换文件 *.swp 格式 同时是隐藏的 如在vim一个文件&#xff0c; 在没有正常退出&#xff0c; 如直接断开连接 在次编辑这个文件 会出现下图的错误 解决方案&#xff1a; 直接删除这个交换文件即可 rm -fr .zen.txt.swp

经典左旋,指针面试题

今天给大家带来几道面试题&#xff01; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 我们可以先自己自行思考&#xff0c;下面是参考答案&#xff1a; 方法一&#xff1a; #define _CRT_SEC…

人工智能网络安全挑战赛(AIxCC):超亿元大奖等你来拿!

2023年底&#xff0c;DARPA开启了一项前所未有的挑战——人工智能网络安全挑战赛&#xff08;AIxCC&#xff09;&#xff0c;旨在通过技术竞赛探索AI时代下网络安全的新格局。该赛事希望孕育出一种创新的网络安全通用人工智能&#xff08;AGI&#xff09;系统&#xff0c;该系统…

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…

阿里云 DMS 执行sql变更

数据库开发-数据变更-无锁变更 选择数据库&#xff1a;比如要更新生产库&#xff0c;搜索生产库名字。 填入变更sql。

实现两栏布局和三栏布局的多种详细方法

目录 一、背景两栏布局三栏布局 二、两栏布局flex弹性布局 三、三栏布局两边使用 float&#xff0c;中间使用 margin两边使用 absolute&#xff0c;中间使用 margin两边使用 float 和负 margin使用 display: table 实现使用flex实现grid网格布局 参考文献 一、背景 在日常布局…

AI大模型专题:大模型赋能座舱,智能座舱新战场

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;大模型赋能座舱&#xff0c;智能座舱新战场》。 &#xff08;报告出品方&#xff1a;国泰君安证券&#xff09; 报告共计&#xff1a;19页 大模型技术将给予智能座舱一次深度进化 拥抱大模型技术…

vue 打包下载多层zip文件

npm install jszip npm install file-saverimport JSZip from "jszip"; import FileSaver from "file-saver"; import {Message} from "view-design";/*** 下载文件 传数组* fileList* [* {* type:file,* name:17034953113790548.png,…

ubuntu22.04@laptop安装配置VNC服务端

ubuntu22.04laptop安装&配置VNC服务端 1. 源由2. 系统安装3. VNC安装3.1 系统更新3.2 lightdm安装3.3 x11vnc安装3.4 x11vnc配置3.5 x11vnc自启动3.6 x11vnc状态查询 4. 演示视频5. 附录 - “Failed to start x11vnc service.” 1. 源由 最近系统搞TensorFlow, OpenCV, Py…

免费的ppt网站分享

前言 相信大学生们深有体会&#xff0c;对于学校而言&#xff0c;好像是任何活动都需要我们做ppt&#xff0c;当你拿着自己辛苦做的ppt去展示现场的时候&#xff0c;你看到别人的ppt比你的还好&#xff0c;此时心情就是毙&#xff0c;当你知道人家不过是仅仅的1个小时不到就完成…

本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【数据库数据恢复】Oracle数据库ASM磁盘组数据恢复案例

oracle数据库故障&分析&#xff1a; oracle数据库ASM磁盘组掉线&#xff0c;ASM实例不能挂载。数据库管理员尝试修复数据库&#xff0c;但是没有成功。 oracle数据库数据恢复过程&#xff1a; 1、将oracle数据库所涉及磁盘以只读方式备份。后续的数据分析和数据恢复操作都…

QT中QComboBox添加点击事件,实现下拉框自动刷新

因为项目需要&#xff0c;在QT中的ui界面添加QComboBox控件&#xff0c;需求是实现控件的点击事件&#xff0c;查了资料&#xff0c;发现这个控件类的本身是没有点击信号可以使用的。 但是QT是基于C的面向对象&#xff0c;有了这个特点&#xff0c;我们就可以继承原来的类&…

QSS样式表简单梳理记录

1.带namespace的类&#xff0c;样式表写法&#xff1a; // 命令空间LW&#xff0c;类名Demo LW--Demo {background-color: rgba(0, 0, 0, 0.5); } 2.带状态的类&#xff0c;样式表写法&#xff1a; // 类名Demo&#xff0c;状态current Demo[current"true"] {back…

Java基础 集合(二)List详解

目录 简介 数组与集合的区别如下&#xff1a; 介绍 AbstractList 和 AbstractSequentialList Vector 替代方案 Stack ArrayList LinkedList 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界…

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…

static 成员函数

在书上看到这样一段话 ”在引入static 成员函数之前&#xff0c;C语言要求所有的成员函数都必须经由该 class 的对象来调用。而实际上&#xff0c;只有当一个或多个 nonstatic 数据成员在成员函数中被直接存取时&#xff0c;才需要 class 的对象。class 对象提供了 this 指针来…

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字…