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

news2024/10/6 10:30:32

🎇个人主页: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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道

基于MATLAB实现的OFDM仿真调制解调&#xff0c;BPSK、QPSK、4QAM、16QAM、32QAM&#xff0c;加性高斯白噪声信道、TDL瑞利衰落信道 相关链接 OFDM中的帧&#xff08;frame&#xff09;、符号&#xff08;symbol&#xff09;、子载波&#xff08;subcarriers&#xff09;、导频…

20240127在ubuntu20.04.6下配置whisper

20240131在ubuntu20.04.6下配置whisper 2024/1/31 15:48 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的驱动程序和CUDA。可选安装&#xff01; 3、配置whispe…

Windows Server 2003 DNS服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DNS服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 2.服务器搭建 3)安装Web服务器和DNS服务器 4)查看安装是否成功 5)这里直接配置DNS服务器了,Web服务器如何配置我已经发布过了 文章目录 Windows Serve…

(已解决)Properties和Yaml格式互转

工具转换&#xff1a; 推荐转换工具或者下载idea插件yamls yml&#xff0c;properties互转工具&#xff1a;yaml和proper互转工具 插件转换&#xff1a; 下载yaml插件&#xff0c;对需要转换的文件右键选择转换

林浩然与他的“圆”满人生

林浩然与他的“圆”满人生 Lin Haoran and His “Round” Life of Fulfillment 在那遥远的数学王国&#xff0c;有一个名叫林浩然的小哥&#xff0c;他可不是一般的程序员&#xff0c;而是个痴迷于几何之美、生活之趣的大玩家。话说有一天&#xff0c;林浩然正沉浸在毕达哥拉斯…

4秒读取50w行Excel数据

4秒读取50w行Excel数据 文章比较了几种常用的读取Excel的方法&#xff0c;最终发现rust库Calamine的速度最快&#xff0c;可以在4秒内读取50w行excel数据。 原文&#xff1a;Fastest Way to Read Excel in Python&#xff1a;https://hakibenita.com/fast-excel-python 我们在…

【FFmpeg】ffplay 命令行参数 ① ( 设置播放分辨率 | 禁用 音频 / 视频 / 字幕 选项 )

文章目录 一、ffplay 命令行参数 - 设置播放分辨率1、强制设置通用播放分辨率 -x -y 参数2、命令行示例 - 正常播放视频3、命令行示例 - 强制设置播放分辨率4、设置 YUV 播放分辨率 -video_size 和 像素设置 -pixel_format5、全屏播放 -fs 参数 二、ffplay 命令行参数 - 禁用 音…

ElementUI 组件:Container 布局容器

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container.vue页面效果图 项目里el-container.vue代码 <script> import PagePath from "/components/PagePath.vue";export default {name: el_conta…

离线使用Element UI和Vue

需要依赖如下&#xff1a; 1.vue.js; 2.index.js(Element UI) 3.index.css(Element UI) 4.element-icons.ttf(Element UI字体) 5.element-icons.woff(Element UI图标) 下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nGOi0Vm_xExRGmVp6oVLoA 提取…

(自用)learnOpenGL学习总结-高级OpenGL-帧缓冲Framebuffers

我们在之前使用了很多缓冲了&#xff1a;颜色缓冲、深度缓冲、模板缓冲。这些缓冲结合起来叫做帧缓冲&#xff0c; 其实也能从名字理解&#xff0c;每一帧屏幕都需要不断更新画面&#xff0c;对应的缓冲也需要更新。 不过上面这些都是在默认的缓冲里面做的&#xff0c;现在我…

【ARM Trace32(劳特巴赫) 使用介绍 3.1 -- 不 attach core 直接访问 memory】

文章目录 背景介绍背景介绍 在使用 trace32 时在有些场景需要不 attach core 然后去读写 memory,比如在某些情况下 core 已经挂死连接不上了,这个时候需要dump内存,这个时候需要怎做呢? print "test for memory access directly";SYStem.OPTION WAITRESET OF…

【Java 数据结构】优先级队列(堆)

优先级队列&#xff08;堆&#xff09; 1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 3.常用…

streampark+flink一键整库或多表同步mysql到doris实战

streamparkflink一键整库或多表同步mysql到doris实战&#xff0c;此应用一旦推广起来&#xff0c;那么数据实时异构时&#xff0c;不仅可以减少对数据库的查询压力&#xff0c;还可以减少数据同步时的至少50%的成本&#xff0c;还可以减少30%的存储成本&#xff1b; streampar…

win11安装wsl作为linux子系统并当作服务器

wsl安装 打开控制面板&#xff0c;找到启用或关闭windows功能 开启windows虚拟机监控平台和适用于Linux的Windows子系统&#xff0c;重启电脑。 打开microsoft store搜索ubuntu&#xff0c;找到合适的版本下载安装 输入wsl -l如下所示&#xff0c;即为安装成功。 安装过程比较…

WebAssembly核心编程[1]:wasm模块实例化的N种方式

当我们在一个Web应用中使用WebAssembly&#xff0c;最终的目的要么是执行wasm模块的入口程序&#xff08;通过start指令指定的函数&#xff09;&#xff0c;要么是调用其导出的函数&#xff0c;这一切的前提需要创建一个通过WebAssembly.Instance对象表示的wasm模块实例(源代码…

京东广告算法架构体系建设--高性能计算方案最佳实践 | 京东零售广告技术团队

1、前言 推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide & Deep相对简单的网络结构进行建模&#xff0c;容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区&#xff0c;基于Transformer用户行为序列和Att…

springboot137欢迪迈手机商城设计与开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

HBase介绍

一、HBase简介 1.1、HBase是什么 Google在200-2006发表了GFS、MapReduce、BigTable三篇 论文 &#xff0c;号称“三驾马车”&#xff0c;开启了大数据的时代。 GFS是Google File System&#xff0c;开源实现是HDFS&#xff08;Hadoop File System&#xff09;。 MapReduce…

全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

前言 最近开始做这个裂缝识别的任务了&#xff0c;大大小小的问题我已经摸得差不多了&#xff0c;然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务&#xff0c;也就是我们说的裂缝识别的任务。作为前言&#xff0c;先来说说场景&#xff1a; 现在相…