数据结构之初识泛型

目录:

一.什么是泛型
二.引出泛型
三.泛型语法及,泛型类的使用和裸类型(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.mzph.cn/bicheng/24637.shtml

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

相关文章

JSP中连接数据库MySQL

JSP中连接数据库MySQL 一、软件环境 下载并安装MySQL&#xff0c;Tomacat&#xff0c;JDBC、IDEA或其他IDE&#xff0c;本文使用IDEA 二、环境配置 将其环境变量配置好之后&#xff0c;下载Java 专用的连接MySQL的驱动包JDBC。 下载链接&#xff1a;https://dev.mysql.com/…

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

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

帕友饮食改善的小建议!

一、增加膳食纤维的摄入 帕金森病患者应增加膳食纤维的摄入量&#xff0c;以帮助调节肠道功能&#xff0c;预防便秘。膳食纤维丰富的食物包括蔬菜、水果、全谷类食物等。患者应确保每天摄入足够的膳食纤维&#xff0c;以保持肠道通畅&#xff0c;缓解帕金森病可能带来的消化不…

[AIGC] Springboot 自动配置的作用及理由

在详细解释SpringBoot的自动配置之前&#xff0c;先介绍以下背景知识。在创建现代复杂的应用程序时&#xff0c;一个困难的部分是正确地设置您的开发环境。这个问题尤其在Java世界中尤为突出&#xff0c;因为您必须管理和配置许多独立的标准和技术。 当我们谈论Spring Boot的自…

【Unity】官方文档学习-光照系统

目录 1 前言 2 光照介绍 2.1 直接光与间接光 2.2 实时光照与烘焙光照 2.3 全局光照 3 光源 3.1 Directional Light 3.1.1 Color 3.1.2 Mode 3.1.3 Intensity 3.1.4 Indirect Multiplier 3.1.5 Shadow Type 3.1.6 Baked Shadow Angle 3.1.7 Realtime Shadows 3.1…

数据挖掘--分类

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 基本概念 决策树归纳 决策树:决策树是一…

如何提高网站访问量?

提高网站访问量通常需要一个多方面的策略&#xff0c;涉及SEO、内容营销、社交媒体和其他网络营销手段&#xff0c;而我们仅从seo入手来说说 关键词优化是SEO的核心&#xff0c;它确保网站能够针对潜在用户的搜索查询进行优化。这不仅涉及在网站内容中使用正确的关键词 还需要…

问题:前肢的前方称() #微信#经验分享#微信

问题&#xff1a;前肢的前方称&#xff08;&#xff09; A . 掌侧 B . 跖侧 C . 背侧 D . 胫侧 E . 桡侧 参考答案如图所示

TOGAF数字化转型的关键(文尾附在线TOGAF免费测试)

业务架构驱动数据架构和应用架构的设计&#xff0c;而应用架构又依赖于数据架构和技术架构的支持。技术架构则为整个架构提供了稳定的基础设施。 在数字化转型中&#xff0c;协调和整合这四种架构是至关重要的。通过确保它们之间的一致性和协同工作&#xff0c;可以实现企业业务…

极简主义在UI设计中的应用及解析

极简主义&#xff0c;即“少就是多”。在设计中&#xff0c;极简主义是许多艺术概念之一&#xff0c;它描述了一种内容形式&#xff0c;可以在许多方面使用。现在移动UI界面和网页设计中的极简主义设计越来越多。即时设计认为&#xff0c;极简主义UI界面不仅美观&#xff0c;而…

[经验] 昆山教育网(昆山教育网中小学报名) #媒体#职场发展#微信

昆山教育网&#xff08;昆山教育网中小学报名&#xff09; 昆山教育局网站 网站&#xff1a;昆山市教育局 昆山市教育局全面贯彻执行党和国家的教育方针、政策&#xff0c;落实有关教育工作的法律、法规&#xff1b;负责制定本市教育工作的实施意见和措施&#xff0c;并监督…

TriForce: 突破长序列生成瓶颈的分层投机解码技术

在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的长序列生成能力一直是研究的热点。然而&#xff0c;随着模型规模的增长&#xff0c;推理过程中的内存和计算瓶颈成为了限制其应用的主要障碍。为了解决这一问题&#xff0c;Carnegie Mellon University和…

1867java银证转账系统系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java银证转账系统系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&a…

go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

什么是JWT JWT,全名为JSON Web Token&#xff0c;是当下主流的一种服务端通信认证方式&#xff0c;具有轻量,无状态的特点&#xff0c;它实现了让我们在用户与服务器之间传递安全可靠的Json文本信息&#xff0c;它的使用过程主要是这样的&#xff1a; 当用户注册的时候&#x…

【百万字详解Redis】集群

文章目录 一、集群模式概述1.1、什么是集群模式1.2、集群模式特点1.3、集群工作方式 二、集群模式的搭建2.1、搭建前的准备2.2、修改集群配置2.3、启动redis服务2.4、创建集群2.5、查看redis服务状态2.6、进入一个节点2.7、测试操作 三、集群操作3.1、主从切换3.2、从节点操作3…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

2024年如何通过完善的工程化,从0到1手把手建立个人 react 组件库

本文聚焦于快速创建并部署个人的组件库&#xff0c;方便平时开发中将通用的组件抽出&#xff0c;也可用于简历上展示个人的组件成果~ 组件库体验地址&#xff1a;components-library 关于以上内容&#xff0c;你是否好奇如何实现的&#xff0c;对于大多数项目&#xff0c;诸如…

【C语言】预处理详解(上卷)

前言 预处理也是C语言中非常重要的存在。那么就详细地来了解一下吧。 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 1 __FILE__ //进行编译的源文件 2 __LINE__ //文件当前的…

JavaSE——抽象类和接口

目录 一 .抽象类 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类的作用 二. 接口 1.接口的概念 2.语法规则 3.接口的使用 4.接口特性 5.实现多个接口 6.接口间的继承 三.抽象类和接口的区别 一 .抽象类 1.抽象类概念 在面向对象的概念中&#xff0c;所有的对…

python -- series和 DataFrame增删改数据

学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…