【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

news2025/4/12 14:16:00

前言

泛型是一种编程概念,它允许我们编写可以适用于多种数据类型的代码。通过使用泛型,我们可以在编译时期将具体的数据类型作为参数传递给代码,从而实现代码的复用和灵活性

在传统的编程中,我们通常需要为不同的数据类型编写不同的代码,这样会导致代码冗余和维护困难。而泛型的出现解决了这个问题,它使得我们可以编写一次代码,然后在需要的地方使用不同的数据类型进行实例化~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

包装类

装箱

法一(过时方法)

法二(手动装箱)

法三(自动装箱)

拆箱

泛型

现在有一个需求

不使用泛型

使用泛型

泛型的上界

应用

泛型方法

泛型方法举例

泛型方法静态化


包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。

除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。

装箱

法一(过时方法)

法二(手动装箱)

    public static void main(String[] args) {
        int a=10;
//        Integer ii=new Integer(a);//该方法已过时
        Integer ii=Integer.valueOf(a);//将基本类型int变为引用类型Integer  
    }

法三(自动装箱)

Integer ii=a;

拆箱

    public static void main(String[] args) {
        Integer ii=10;//自动装箱
        int a=ii;//自动拆箱
        int aa=ii.intValue();//手动拆箱
    }

泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。

泛型是在JDK1.5引入的新的语法。用于把类型参数化。将类型以参数的形式进行传递。

所有类的父类默认都是Object类

现在有一个需求

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值

不使用泛型

class MyArray{
    public Object[] array=new Object[10];
    public void setArray(int pos,Object x){
        array[pos]=x;
    }
    public Object getVal(int pos){
        return array[pos];
    }
}


public class Test {
    public static void main(String[] args) {
        MyArray myArray=new MyArray();
        myArray.setArray(0,1);
        myArray.setArray(1,20);
        myArray.setArray(2,"hello");
        String s=(String)myArray.getVal(2);
//getVal的返回类型是Object类,而接收的类型是String类型,要强制转换为String类型,否则会报错
        System.out.println(s);
    }
}

任何类型的数据在这里都可以存放,但是当数组的元素过多时,每一个元素都要强制类型转换就显得不方便了。

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类 型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

使用泛型

class MyArray<T> {//在类的后面加上<>  ,<T>代表占位符,表示当前类是一个泛型类
    public Object[] array = new Object[10];

    public void setArray(int pos, T x) {
        array[pos] = x;
    }

    public T getVal(int pos) {
        return (T) array[pos];
    }
}
public class Test {
    public static void main(String[] args) {
        //<Integer>代表传的数据类型是整形类型,
        // 后面的MyArray<>可以不写Integer,编译器会通过前面的推导,但是要加上<>
        MyArray<Integer> myArray=new MyArray<>();
        //只能写类 类型,不能写简单类型
        //MyArray<int> myArray=new MyArray<>();//err

        myArray.setArray(0,1);
        myArray.setArray(1,2);
        //编译的时候,每次存储x值,会检查是否是指定的数据类型,若不一样,会报错
//        myArray.setArray(1,"hello");
// 这里不需要进行强制类型转换,因为放数据的时候就进行了严格的检查
        Integer x= myArray.getVal(1);
        MyArray<String> myArray2=new MyArray<>();
        myArray2.setArray(0,"hewsa");

        System.out.println(myArray2.getVal(0));
    }

【规范】类型形参一般使用一个大写字母表示,常用的名称有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等 - 第二、第三、第四个类型

泛型的编译——擦除机制

擦除机制:在编译的过程当中,将所有的T替换为Object这种机制。 Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息

泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

语法

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

例如下面代码表示 只接受 Number 的子类型作为 E 的类型实参


public class MyArray<E extends Number> {
   ...
}

应用

定义一个泛型类,用于找到数组中最大值

//定义一个泛型类,找到数组中最大值
class Alg<T extends Comparable<T>>{//表示传的泛型都是要实现Comparable接口的
    public T findMax(T[]array){
        T max=array[0];
        for (int i = 0; i < array.length; i++) {
//            if(array[i]>max){//引用类型不能直接比较,会报错,要实现comparable接口比较
            if(array[i].compareTo(max)>0){
                max=array[i];
            }
        }
        return max;
    }
}
public class Test {
    public static void main(String[] args) {
        Alg<Integer> alg=new Alg<>();
        Integer [] array={1,2,3,4,5,6,7};
        Integer x =alg.findMax(array);
        System.out.println(x);
    }

结果:7

泛型方法

泛型方法举例

class Alg2{
    //泛型方法
    public<T extends Comparable <T>> T findMax(T[]array){
        T max=array[0];
        for (int i = 0; i < array.length; i++) {
            if(array[i].compareTo(max)>0){
                max=array[i];
            }
        }
        return max;
    }
}
public class Test {
    public static void main(String[] args) {
        Alg2 alg2 =new Alg2();
        Integer[] array={1,2,3,4,5,6,7};
//        Integer x =alg2.<Integer>findMax(array);
        Integer x =alg2.findMax(array);//不写<Integer>也行,编译器会通过前面来推导
        System.out.println(x);
    }

泛型方法静态化

class Alg3{
    //泛型方法静态化 相较于泛型方法,只是加了static而已
    public static <T extends Comparable <T>> T findMax(T[]array){
        T max=array[0];
        for (int i = 0; i < array.length; i++) {
            if(array[i].compareTo(max)>0){
                max=array[i];
            }
        }
        return max;
    }
}
public class Test {
    public static void main(String[] args) {
        Integer[] array={1,2,3,4,5,6,7};
        Integer x =Alg3.findMax(array);//静态方法直接通过类名调用
        System.out.println(x);
    }

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

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

相关文章

web项目运行时,报了500错误(HTTP Status 500 – Internal Server Error)

web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09; 文章目录 web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09;前言一、 解决方法&#xff1a;Project Structure…

视频监控/视频集中存储/云存储EasyCVR视频汇聚平台如何切换主子码流?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

赛氪网凭借教育人优势,荣获中关村高新技术企业协会会员单位称号

2023年&#xff0c;中关村科技园区管理委员会正式公布了一批新的高新技术企业协会会员单位名单&#xff0c;赛氪网荣幸成为其中一员。这一荣誉的获得&#xff0c;不仅是对赛氪网在竞赛、科技创新教育领域的充分肯定&#xff0c;也标志着赛氪网在推动高新技术发展方面迈出了坚实…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

CorelDRAW Graphics Suite 2023最新官网中文版本CDR2022免费激活下载

CorelDRAW Graphics Suite 2023最新中文版本免费激活下载作为一款矢量图形制作工具软件&#xff0c;专门为从事插画设计、广告设计、网页设计、图形编辑等设计行业推出的工具软件。界面也是非常的简洁&#xff0c;能够让用户更快了解其中的各个功能&#xff0c;功能方法一目了然…

增强现实(AR)技术的应用场景

增强现实&#xff08;AR&#xff09;技术将虚拟信息与现实世界融合&#xff0c;为用户提供更加直观、交互式的体验。AR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些AR的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

wireshark RTP分析参数

主要看丢弃和Delta&#xff0c; 丢弃就是丢掉的udp包&#xff0c;所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少&#xff0c;比如G711A&#xff0c;ptime20&#xff0c;那么delta理论上应该趋近于20. 这里的de…

【第18章】spring-resource

文章目录 前言一、Resource1.测试类2.测试结果 二、ResourceLoader1.测试类2.测试结果 三、ResourceLoaderAware1.实现类2.配置文件3.测试类4.测试结果5.结论 总结 前言 在Spring框架中&#xff0c;Resource是一个关键组件&#xff0c;它位于org.springframework.core.io包中&…

HTML使用jQuery实现两个点击按钮,分别控制改文本字体颜色和字体大小

jQuery 简介 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;旨在简化对 HTML 文档的操作、事件处理、动画效果和 AJAX 等操作。 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&q…

【Godot4自学手册】第三十八节给游戏添加音效

今天&#xff0c;我的主要任务就是给游戏添加音效。在添加音效前&#xff0c;我们需要了解一个东西&#xff1a;音频总线。这个东西或许有些枯燥&#xff0c;如果你只为添加一个音效没必要了解太多&#xff0c;但如果你以后将要经常与音频播放打交道&#xff0c;还是要了解一下…

在线测径仪的六类测头组合形式!哪种适合你?

在线测径仪&#xff0c;这一现代工业的精密仪器&#xff0c;犹如一位技艺高超的工匠&#xff0c;以其卓越的性能和精准度&#xff0c;为工业生产提供了坚实的保障。它的出现&#xff0c;不仅提高了生产效率&#xff0c;更保证了产品质量&#xff0c;为企业的可持续发展注入了强…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

怎么在抖音上开店卖货?做好这些,就能轻松赚到辛苦钱!

大家好&#xff0c;我是电商花花。 抖音电商在这几年一直都非常火爆&#xff0c;不少商家和达人都在抖音上赚麻了&#xff0c;这个抖音小店项目在不断的吸引着商家入驻。 说实话&#xff0c;花花就是抖音小店的受益者&#xff0c;让当初啥也不懂的新手小白&#xff0c;到现在…

羊大师解析,夏日消暑羊奶来帮忙

羊大师解析&#xff0c;夏日消暑羊奶来帮忙 炎炎夏日&#xff0c;烈日当空&#xff0c;人们总是寻找各种方式来消暑降温。除了常见的冷饮、空调等&#xff0c;其实还有一种天然、健康的饮品可以帮助我们度过酷暑——那就是羊奶。 羊奶作为一种营养丰富的天然饮品&#xff0c;不…

【Canvas与艺术】绘制金色八卦图

【关键点】 等比例缩放各部件及将八卦转为“二进制”的过程。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用…

加密、解密、签名、验签、数字证书、CA浅析

一、加密和解密 加密和解密应用的很广&#xff0c;主要作用就是防止数据或者明文被泄露。 加解密算法主要有两大类&#xff0c;对称加密和非对称加密。对称加密就是加密和解密的密钥都是一个&#xff0c;典型的有AES算法。非对称加密就是有公钥和私钥&#xff0c;公钥可以发布…

C++/Qt 小知识记录5

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识5 Windows下查看端口占用情况C调用Python三方库测试库有没有被加上的测试方法初始化使用Python的env环境&#xff0c;用Py_SetPythonHome设置GDAL相关的&#xff0c;需要把osgeo、rasterio的路径加入…

Linux 操作系统的引导过程

Linux系统开机引导过程&#xff1a; 开机自检 检测硬件设备&#xff0c;找到能够引导系统的设备&#xff0c;比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 GRU网络 4.3 注意力机制&#xff08;Attention&#xff09; 4.4 WOA优化算法 5.算法完整程序工程 1.算法运行效果图…