数据结构之初识泛型

目录:

一.什么是泛型
二.引出泛型
三.泛型语法及,泛型类的使用和裸类型(Raw Type)  的了解
.
   四.泛型的编译:
   五.泛型的上界
   六.泛型方法

注意:在看泛型之前可以,回顾一下,包装类,包装类就是服务泛型的 :初识JAVA中的包装类,时间复杂度及空间复杂度-CSDN博客

一.什么是泛型:  

1.一般的类和方法只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。

2.泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多类型。从代码上讲,就是对类型实现了参数化。

 

 

二.引出泛型:

1.实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?看下面代码:问题是:1.如果数据太多,每次返回,向下转型太麻烦
2.元素放置也很混乱
class My_array {public Object[] array = new Object[10];public Object getArray(int pos) {return array[pos];}public void setArray(int pos, Object val) {this.array[pos] = val;}
}public class Test {public static void main0(String[] args) {My_array my_array = new My_array();//放置元素太乱,my_array.setArray(0, "haha");my_array.setArray(1, 2);//如果数据太多,每次返回,向下转型太麻烦String str = (String) my_array.getArray(0);}
}
3. 所以,泛型的主要目的: 就是指定当前的容器,要持有什么类型的对象 让编译
器去做检查 此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型

这个时候如果我们使用泛型,就可以解决这两个缺陷。泛型对数据结构学习也很重要

 

 

 

三.泛型语法及,泛型类的使用和裸类型(Raw Type) 的了解

1.语法 :下面给出一些泛型类的语法:

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}

2.泛型类的使用:引出泛型在缺陷的,代码进行改写:

  
public static void main(String[] args) {//指定你要的类型My_array<Integer/*只能写类类型*/> my_array = new My_array</*Integer*/>();//        my_array.setArray(0, "haha");//自动类型检查my_array.setArray(0, 2);Integer a =  my_array.getArray(0);//自动类型转换System.out.println(a);/*** 想给数组放你想要的类型*/My_array<String> my_array1 = new My_array<>();my_array1.setArray(0, "haha");String str = my_a rray1.getArray(0);System.out.println(str);}}/*** 用泛型*///这个E相当于占位符
class My_array<E> {public Object[] array = new Object[10];public E getArray(int pos) {return (E) array[pos];}public void setArray(int pos, E val) {this.array[pos] = val;}
}

 注意:类名后的 <T> 代表占位符,表示当前类是一个泛型类,泛型只能接受类,所有的基本数据类型必须使用包装类! 

规范:类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型
3.裸类型(Raw Type) 的了解:用上面的例子里的,主方法说明:
注意:我们不要自己去使用裸类型,裸类型是为了兼容老版本的 API 保留的机制
总结:
1. 泛型是将数据类型参数化,进行传递
2. 使用 <T> 表示当前类是一个泛型类。
3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换
   四.泛型的编译:
1. 擦除机制: 在Java虚拟机运行时,是不允许泛型 ,存在的,所以 在编译成字节码文件过程 会将所有的<E>替换为Object这种机制,我们称为:擦除机制。(可以到out目录,通过反汇编来查看) (命令:javap)
例子:下面这个代码中的,set方法的参数被擦除,为Object类:
class My_array<E> {public Object[] array = new Object[10];public E getArray(int pos) {return (E) array[pos];}public void setArray(int pos, E val) {this.array[pos] = val;}
}

   五.泛型的上界:

1.语法:这里用到extends关键字

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

2.来个例子:这里E继承了,Comparable接口,下面就可以使用,compareTo方法来,比较,

如果不规定这个边界那么通过擦除机制,就不能直接比较。规定了边界,就有了方法来比较

class Alg<E extends Comparable<E>> {public E Find_Max(E[] array) {E max = array[0];for (int i = 0; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}public class Test {public static void main1(String[] args) {Integer[] array = new Integer[]{1,2,3,4,5,6};Alg<Integer> alg = new Alg<>();int ret = alg.Find_Max(array);//自动类型转换System.out.println(ret);}
}

这里还有一点值得注意:这里E继承了,Comparable接口,后没有重写,compareTo方法,因为你传的泛型参数(Integer)已经实现了Comparable接口,可以直接使用。

 

 

   六.泛型方法:

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


class Alg2 {public<E extends Comparable<E>>  E Find_Max(E[] array) {E max = array[0];for (int i = 0; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}public static void main2(String[] args) {Alg2 alg2 = new Alg2();Integer[] array = new Integer[]{1,2,3,4,5,6};int ret = alg2./*<Integer>*/Find_Max(array);System.out.println(ret);}

2.静态泛型方法:可以不用每次,实例化对象去调用方法,因为静态行为,不依赖对象,可以直接用类名调用

代码如下:


class Alg3 {public static  <E extends Comparable<E>>  E Find_Max(E[] array) {E max = array[0];for (int i = 0; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}/*** 泛型静态方法2:加static* 静态行为,不依赖对象,可以直接用类名调用(不用每次,new对象)*/public static void main(String[] args) {Integer[] array = new Integer[]{1,2,3,4,5,6};int ret = Alg3./*<Integer>*/Find_Max(array);System.out.println(ret);}
}

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

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

相关文章

[经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展

场效应管是如何发挥作用的 在现代电子技术领域&#xff0c;场效应管&#xff08;MOSFET&#xff09;是一种重要的半导体元器件。它的作用非常广泛&#xff0c;例如在集成电路中扮演着关键的角色。在本文中&#xff0c;我们将详细探讨场效应管的作用及其在实际应用中的意义。 简…

Java如何实现pdf转base64以及怎么反转?

问题需求 今天在做发送邮件功能的时候&#xff0c;发现邮件的附件部分&#xff0c;比如pdf文档&#xff0c;要求先把pdf转为base64&#xff0c;邮件才会发送。那接下来就先看看Java 如何把 pdf文档转为base64。 两种方式&#xff0c;一种是通过插件 jar 包的方式引入&#xf…

【动手学深度学习】使用块的网络(VGG)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 多层感知机模型选择、欠拟合和过拟合 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 理解块的网络结构&#xff1b;比较块的网络与传统…

Ansys的电磁场分析和系统电路仿真软件Electronics 2024 R1版本在Windows系统的下载与安装配置

目录 前言一、许可管理工具安装二、许可配置三、EM安装四、MCAD和帮助文件安装&#xff08;可选择&#xff0c;非必要&#xff09;总结 前言 “ ANSYS Electromagnetics Suite或ANSYS Electronics Suite是几个功能强大的程序的集合&#xff0c;用于仿真系统的电磁。ANSYS电磁套…

git 大文件上传失败 Please remove the file from history and try again.

根据提示执行命令 --- 查找到当前文件 git rev-list --objects --all | grep b24e74b34e7d482e2bc687e017c8ab28cd1d24b6git filter-branch --tree-filter rm -f 文件名 --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force

MySQL数据库数据恢复方案应对没有where误操作导致的大量数据更新或删除

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

分享飞行棋夫妻互动游戏高阶版,揭秘夫妻飞行棋游戏玩法!

朋友们&#xff0c;今天我要给你们介绍一款超级甜蜜的小游戏——情侣飞行棋。别小看它&#xff0c;这可不是咱们小时候玩的那种&#xff0c;这是专门为咱们这些恩爱的小两口设计的&#xff0c;能让你们的感情在游戏中更加甜蜜蜜&#xff0c;擦出更多爱的火花。 准备好了吗&…

Spring AOP(实现,动态原理)详解版

Spring AOP 1.什么是AOP&#xff1f;1.1引入AOP依赖1.2编写AOP程序 2.Spring AOP核⼼概念2.1 切点(Pointcut)2.2连接点(Join Point)2.3通知(Advice)2.4 切⾯(Aspect) 3.通知类型3.1顺序3.2切⾯优先级 Order3.3 ⾃定义注解 MyAspect 4. Spring AOP 原理5 动态代理怎么实现5.1 JD…

Web后端开发(请求-简单参数)(一)

原始方式&#xff1a; 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParame…

html+CSS+js部分基础运用17

在图书列表中&#xff0c;为书名“零基础学JavaScript”和“HTML5CSS3精彩编程200例”添加颜色。&#xff08;请用class或style属性实现&#xff09;&#xff0c;效果如下图1所示&#xff1a; 图1 图书列表 Class和style的综合应用。&#xff08;1&#xff09;应用class的对象、…

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接&#xff0c;则会一直重试SYN包&#xff0c;各个平台SYN重试间隔并不一致&#xff0c;如下&#xff1a; 异常站点抓包展示&#xff…

抽象的java入门1.3.0

前言&#xff1a; 在1.2.0版本中我们介绍了public class hello {}并从中提取出两个新概 修饰符和作用域 public class hello {public static void main(String[] args) {System.out.println("Hello World");} } 正片&#xff1a; 这一期把剩余的内容刨析出来 pub…

Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战

Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战 目录 Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战 一、简单介绍 二、轮船人员获救预测实战 三、数据处理 1、导入数据 2、对缺失数据的列进行填充 3、属性转换&#xff0c;把某些列的字符串值…

【SkyWalking】启用apm-trace-ignore-plugin追踪忽略插件

背景 使用Agent采集追踪数据的时候&#xff0c;想排除某些路径&#xff0c;比如健康检查等&#xff0c;这样可以减少上报的数据&#xff0c;也可以去除一些不必要的干扰数据。 加载插件 在agent/optional-plugins目录中有个apm-trace-ignore-plugin-${version}.jar插件&…

WEB漏洞服务能提供哪些帮助

在数字化浪潮的推动下&#xff0c;Web应用程序已成为企业展示形象、提供服务、与用户进行交互的重要平台。然而&#xff0c;随着技术的飞速发展&#xff0c;Web应用程序中的安全漏洞也日益显现&#xff0c;成为网络安全的重大隐患。这些漏洞一旦被恶意攻击者利用&#xff0c;可…

AI高考大战,揭秘五大热门模型谁能问鼎数学之巅?

在高考前&#xff0c;我就有想法了&#xff0c;这一次让AI来做做高考题。就用国内的大模型&#xff0c;看哪家的大模型解题最厉害。 第一天考完&#xff0c;就拿到了2024高考数学2卷的电子版&#xff0c;这也是重庆市采用的高考试卷 这次选了5个AI工具&#xff0c;分别是天工&a…

Fatfs

STM32进阶笔记——FATFS文件系统&#xff08;上&#xff09;_stm32 fatfs-CSDN博客 STM32进阶笔记——FATFS文件系统&#xff08;下&#xff09;_stm32 文件系统怎样获取文件大小-CSDN博客 STM32——FATFS文件基础知识_stm32 fatfs-CSDN博客 021 - STM32学习笔记 - Fatfs文件…

React -- memo允许你的组件在 props 没有改变的情况下跳过重新渲染。

memo(Component, arePropsEqual?) 使用 memo 将组件包装起来&#xff0c;以获得该组件的一个 记忆化 版本。通常情况下&#xff0c;只要该组件的 props 没有改变&#xff0c;这个记忆化版本就不会在其父组件重新渲染时重新渲染。但 React 仍可能会重新渲染它&#xff1a;记忆化…

java 大型企业MES生产管理系统源码:MES系统与柔性化产线控制系统的关系、作用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统”,它为操作人员/管理人员提供计划的执行、跟踪以及所有资源(人、设备、物料、客户需求等)的当前状态。 MES系统与柔性化产线控制系统的关系 MES&#xff08;制造执行系统&#xff09;是一种…

离散数学---树

目录 1.基本概念及其相关运用 2.生成树 3.有向树 4.最优树 5.前缀码 1.基本概念及其相关运用 &#xff08;1&#xff09;无向树&#xff1a;连通而且没有回路的无向图就是无向树&#xff1b; 森林就是有多个连通分支&#xff0c;每个连通分支都是树的无连通的无向图&…