数据结构之初识泛型

news2025/1/18 9:05:58

目录:

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

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

相关文章

Mac保姆级配置jdk环境

1.找到下载的jdk环境 通常是这个。留作备用 /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin 然后新开一个终端下执行以下命令 sudo vim ~/.bash_profile 进入编辑模式后 按 i 开始添加内容结束编辑模式按 ESC结束后保存输入 :wq!不保存输入 :q! 注意…

Elastic Platform 8.14:ES|QL 正式发布、静态加密和向量搜索优化

作者&#xff1a;来自 Elastic Gilad Gal, Tyler Perkins, Alex Chalkias, Trevor Blackford, Ninoslav Miskovic, Fabio Busatto, Aris Papadopoulos Elastic Platform 8.14 提供了 Elasticsearch 查询语言 (ES|QL) 的正式发行版 (GA) — Elastic 中数据探索和操作的未来。它还…

编写一个程序,提示用户输入三个点 p0、p1 和 p2,显示 p2 是否在从 p0 到 p1 的线段左侧、右侧,或者在该直线上。

(几何:点的位置)给定一个从点 p0(x0&#xff0c;y0)到pl(xl&#xff0c;pl)的有向线段&#xff0c;可以使用下面的条件来确定点 p2(x2&#xff0c;y2)是在线段的左侧、右侧&#xff0c;或者在该直线上(见下图): 编写一个程序&#xff0c;提示用户输入三个点 p0、p1 和 p2&#…

力扣78. 子集

给你一个整数数组nums&#xff0c;数组中的元素互不相同。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集。你可以按任意顺序返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],[1,3…

spring源码解析-(1)关于Bean

什么是Bean&#xff1f; 是spring对所有注入到IoC容器中的类的统称。 我们要注册进入spirng的bean千奇百怪&#xff0c;所以spring必须需要使用一个统一的定义来标识bean&#xff0c;就有了接下来的BeandDefinition&#xff0c;通过名称我们就可以知道&#xff0c;他是对bean…

Apache IoTDB 分布式架构三部曲(三)副本与共识算法

IoTDB 首创并应用的共识协议统一框架&#xff0c;为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言&#xff0c;为了使得海量数据场景下集群能够横向扩展&#xff0c;集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上&#xff0c;从而能够更…

【C/C++】——小白初步了解——内存管理

目录 1. C/C内存分布 代码区&#xff08;Code Segment&#xff09;&#xff1a; 数据区&#xff08;Data Segment&#xff09;&#xff1a; 堆区&#xff08;Heap&#xff09;&#xff1a; 栈区&#xff08;Stack&#xff09;&#xff1a; 常量区&#xff08;Constant Seg…

spring boot 2.1 集成activiti 6.0.0和activiti-modeler 5.23.0可视化编辑器(随记)

先上pom&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.or…

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

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

【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析&#xff1a;使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…

hot100 -- 二分查找

目录 前言 &#x1f382;搜索插入位置 &#x1f33c;搜索二维矩阵 &#x1f33c;排序数组元素第一和最后一个位置 &#x1f33c;旋转排序数组 &#x1f4aa;旋转排序数组中的最小值 &#x1f4aa;两个正序数组的中位数 前言 二分算法学习_时间超限ac:0%-CSDN博客 &#…

Vue10-事件修饰符

一、示例&#xff1a;<a>标签不执行默认的跳转行为 1-1、方式一 <a href"http://www.baidu.com" onclick"event.preventDefault();">点击我</a> 1-2、方式二 1-3、方式三&#xff1a;事件修饰符 二、Vue的六种事件修饰符 2-1、prevent&…

Edge怎么关闭快捷键

Edge怎么关闭快捷键 在Edge浏览器中&#xff0c;你可以通过以下步骤关闭快捷键&#xff1a; 打开Edge浏览器&#xff0c;输入&#xff1a;edge://flags 并按下回车键。 在Flags页面中&#xff0c;搜索“快捷键”(Keyboard shortcuts)选项。 将“快捷键”选项的状态设置为“…

注册小程序

每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使用请参考 App 参考文档 。 整个小程序只有一个 App 实例&#xff0c;是全部页面共享的。开发者可以通过 getApp 方法获取到全…

HuggingFace团队亲授大模型量化基础: Quantization Fundamentals with Hugging Face

Quantization Fundamentals with Hugging Face 本文是学习https://www.deeplearning.ai/short-courses/quantization-fundamentals-with-hugging-face/ 这门课的学习笔记。 What you’ll learn in this course Generative AI models, like large language models, often exce…

转让无区域商业管理公司挺批行业包变更

无区域的名称我们可以直接进行名称的申请核准。 从新规施行之后&#xff0c;国家局核名批准难度更高。新申请的无区域名称已经停批了&#xff0c;进行核名将更难&#xff0c;而需要满足一定条件并在成立一年后才能变更升级名称。而这个过程并非易事&#xff0c;难度非常高。可以…

45-1 waf绕过 - 文件上传绕过WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装dvwa靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客打开dvwa靶场,先将靶场的安全等级调低,然后切换到文件上传 一、符号变异 在PHP中,由于其弱类型特性,有时候仅有一…

JavaSE——抽象类和接口

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

SpringCloud整合OpenFeign实现微服务间的通信

1. 前言 1.1 为什么要使用OpenFeign&#xff1f; 虽说RestTemplate 对HTTP封装后, 已经⽐直接使⽤HTTPClient简单⽅便很多, 但是还存在⼀些问题. 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错. 代码可读性差, ⻛格不统⼀。 1.2 介绍一下微服务之间的通信方式 微…

Zabbix实现邮件和钉钉实时告警(使用python脚本)

告警和通知 告警是监控的主要职能,是指将到达某一阈值事件的消息发送给用户,让用户在事件发生的时候即刻知道监控项处于不正常状态,从而让用户来决定是否采取相关措施。 zabbix中,告警是由一系列的流程组成的,⾸首先是触发器到达阈值,接下是Active对事件信息进行处理,其…