当前位置: 首页 > news >正文

java集合进阶篇-《泛型》

dc36953054264521b68a923efe53222c.png个人主页→VON

cebd6b4f65b24cda84e774c03af300c0.png收录专栏→java从入门到起飞

目录

一、前言

二、泛型的简要概述

三、泛型的基本概念

类型参数:

通配符:

边界:

使用泛型的好处:

四、泛型类

五、泛型方法

六、思考

七、疑惑


 

一、前言

泛型对于我来说又是一个新的名词,在其他语言中或许也有,只是我可能没学到。接触一个新的东西学习起来是比较吃力的,但收获也挺多的,毕竟是一个新的知识点。有些不理解的地方希望各位大佬能够多加点评。

二、泛型的简要概述

Java中的泛型是一种在编译时检查类型安全性的特性,它允许程序员编写出更加类型安全的代码,同时避免了运行时类型转换错误。泛型是在Java SE 5.0版本中引入的,它使得代码更易于阅读和维护,并且减少了强制类型转换的需要。

三、泛型的基本概念

类型参数

在声明类或接口时使用的占位符类型,通常用大写字母 T、E、K、V 等表示。这些类型参数可以在类或接口的方法签名中使用,以指定具体的类型。

通配符

使用 ? 表示未知类型,可以用来接收任何类型的数据,但不能用来发送数据。通配符可以与限定符结合使用,如 ? extends Number 表示未知类型但必须是 Number 或其子类,? super Integer 表示未知类型但必须是 Integer 或其超类。

边界

通过 <T extends SomeClass><T super SomeClass> 定义类型参数的上界或下界,限制了类型参数的具体范围。

使用泛型的好处:

  • 类型安全:编译器会在编译阶段检查类型错误,而不是在运行时抛出 ClassCastException
  • 重用性:可以通过泛型编写通用的类或方法,这些类或方法可以在不同类型的对象上工作。
  • 清晰性:代码中的类型信息更加明确,提高了代码的可读性和可维护性。

四、泛型类

自行创建泛型类

package ArrayDemo.GenericsDemo;import java.util.Arrays;// 当编写一个类的时候,如果不确定类型,那么这个类就可以定义为泛型类
public class MyArrayList<E> {Object[] obj = new Object[10];int size;// E:表示不确定的类型// e:形参的名字/变量名// 添加元素public boolean add(E e){obj[size] = e;size++;return true;}public E get(int index){return (E)obj[index];}@Overridepublic String toString() {return Arrays.toString(obj);}
}

package ArrayDemo.GenericsDemo;import java.util.ArrayList;
import java.util.Iterator;public class A02_GenericsDemo02 {public static void main(String[] args) {// 泛型的好处// 1.统一的数据类型// 2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就已经确定下来了// java的泛型是伪泛型// 泛型的细节// 1.泛型中不能写基本数据类型// 2.指定泛型的具体类型后,传递数据时可以传入该类类型或者其子类类型// 3.如果不写泛型,类型默认是Object// 泛型类// 使用场景:当一个类中,某个变量的数据类型不确定是,就可以定义带有泛型的类// 泛型类的使用MyArrayList<String> list1 = new MyArrayList<>();list1.add("a");list1.add("b");list1.add("c");list1.add("d");System.out.println(list1);// [a, b, c, d, null, null, null, null, null, null]MyArrayList<Integer> list2 = new MyArrayList<>();list2.add(1);list2.add(2);list2.add(3);list2.add(4);System.out.println(list2);// [1, 2, 3, 4, null, null, null, null, null, null]}
}

因为自定义的泛型并没有明确规定类型,所以集合的类型我们可以根据需求来定义,上述例子中就用了Integer和String两种数据类型进行的创建。

五、泛型方法

自定义泛型方法(可以根据需求进行自行定义)

这里以向集合当中添加元素为例。

package ArrayDemo.GenericsDemo;import java.util.ArrayList;public class ListUtil {private ListUtil(){}public static<E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){list.add(e1);list.add(e2);list.add(e3);list.add(e4);}public static<E> void addAll2(ArrayList<E> list,E...e){for (E element : e) {list.add(element);}}
}

package ArrayDemo.GenericsDemo;import com.von.day13.A;import java.util.ArrayList;public class A03_GenericsDemo03 {public static void main(String[] args) {// 泛型方法// 方法中形参类型不确定时// 方案一:使用类名后面定义的泛型(所有方法都能使用)// 方案二:在方法申明上定义自己的泛型(只有本方法能用)ArrayList<Integer> list1 = new ArrayList<>();ListUtil.addAll(list1,1,2,3,4);System.out.println(list1);// [1, 2, 3, 4]ArrayList<String> list2 = new ArrayList<>();ListUtil.addAll(list2,"a","b","c","d");System.out.println(list2);// [a, b, c, d]ArrayList<String> list3 = new ArrayList<>();ListUtil.addAll2(list3,"a","b","c","d","e","f","g");System.out.println(list3);// [a, b, c, d, e, f, g]}
}

六、思考

没有泛型的时候集合如何存储数据?

package ArrayDemo.GenericsDemo;import java.util.ArrayList;
import java.util.Iterator;public class A01_GenericsDemo01 {public static void main(String[] args) {// 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查// 泛型的格式:<数据类型>// 注:泛型只支持引用数据类型// 思考;没有泛型的时候集合如何存储数据// 1.创建集合并添加数据ArrayList list = new ArrayList();// 字符list.add("a");list.add("b");list.add("c");list.add("d");// 数字list.add(1);list.add(2);list.add(3);// 对象list.add(new Student("zhang",20));list.add(new Student("li",19));list.add(new Student("wang",22));// 2.遍历集合中的每个元素Iterator it = list.iterator();while(it.hasNext()){// 多态的弊端是不能访问子类的特有功能// 如:不能够访问学生这一对象中的单独一个System.out.println(it.next());}}
}

如果没有给集合指定类型,默认为所有的数据类型都是Object类型
此时可以添加任意的数据类型
不过也有弊端,不能够访问特有的行为

因此就推出了泛型,可以在添加数据的时候就把类型进行统一
而且在获取数据的时候,也不用进行强转操作了,十分的方便

七、疑惑

 

这里的输出为什么是地址值,而不是集合中的元素值?

希望各位大佬们能够解答 

相关文章:

java集合进阶篇-《泛型》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、泛型的简要概述 三、泛型的基本概念 类型参数&#xff1a; 通配符&#xff1a; 边界&#xff1a; 使用泛型的好处&#xff1a; 四、泛型类 五、泛型方法 六、思考 七、疑惑 一、前言 泛型对于我来说又…...

pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络

VGG16是由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;提出的一种深度卷积神经网络模型。 VGGNet 探索了卷积神经网络的深度与其性能之间的关系&#xff0c;成功地构筑了 16~19 层深的卷积神经网络&#xff0c;同时拓展性又很强&#xff0c;迁移到其它图片…...

题目:连续子序列

解题思路&#xff1a; 首先&#xff0c;不能使用暴力枚举&#xff0c;时间为O(n2)&#xff0c;超时。以下为正确做法&#xff1a; 假设找到一段区间&#xff08;其和>m&#xff09;&#xff0c;如上图黄色部分&#xff0c;那么该区间加上i后面的元素形成的新区间和都>m&a…...

深入解析:Nacos AP 模式的实现原理与应用场景

优质博文&#xff1a;IT-BLOG-CN 一、CAP 基础 ‌Nacos作为注册中心同时支持CP和AP模式。‌ Nacos通过不同的协议和机制来实现这两种模式&#xff0c;以满足不同的需求场景。 在Nacos中&#xff0c;默认情况下使用的是AP模式&#xff0c;通过Distro协议来实现。AP模式主要关…...

snmpnetstat使用说明

1.snmpnetstat介绍 snmpnetstat命令是用来查看snmp服务器的端口连接信息。 2.snmpnetstat安装 1.snmpnetstat安装 命令: yum -y install net-snmp net-snmp-utils [root@logstash ~]# yum -y install net-snmp net-snmp-utils Loaded plugins: fastestmirror Loading mi…...

linux线程 | 同步与互斥 | 互斥(下)

前言&#xff1a;本篇文章主要讲述linux线程的互斥的知识。 讲解流程为先讲解锁的工作原理&#xff0c; 再自己封装一下锁并且使用一下。 做完这些就要输出一堆理论性的东西&#xff0c; 但博主会总结两条结论&#xff01;&#xff01;最后就是讲一下死锁。 那么&#xff0c; 废…...

2024-10-17 问AI: [AI面试题] 讨论 AI 的挑战和局限性

文心一言 AI&#xff08;人工智能&#xff09;虽然取得了显著的进步&#xff0c;但仍面临多方面的挑战和局限性。以下是对AI挑战和局限性的详细讨论&#xff1a; 一、数据质量与可靠性 数据质量&#xff1a;AI系统依赖于高质量的数据进行训练和学习。如果数据质量低劣或包含…...

go基础(一)

包声明引入包函数变量语句&表达式注释 package main//包声明import "fmt"//引入包 //函数 func main() {/* 这是我的第一个简单的程序 */fmt.Println("Hello, World!") }基础语法 标记 go程序可以由多个标记组成&#xff0c;可以是关键字&#xff0…...

python忽略warnings 的方法

我在训练深度学习模型的时候一直出现这样的警告&#xff0c;但是不影响运行&#xff1a; UserWarning: Failed to load image Python extension: [WinError 127] 找不到指定的程序。 warn(f"Failed to load image Python extension: {e}") 要避免在 Python 程序运…...

2024年底蓝奏云最新可用API接口列表 支持优享版 无需手动抓取cookie

Lanzou Pro V1 接口列表 API状态版本路由获取文件与目录✅^1.0.1/v1/getFilesAndDirectories?url{}&page{}获取目录✅^1.0.0/v1/getDirectory?url{}获取文件✅^1.0.1/v1/getFiles?url{}&page{}搜索文件✅^1.0.0/v1/searchFile?url{}&wd{}依Id解析✅^1.0.2/v1/…...

Linux常用命令详细解析(含完整命令演示过程)

目录 1. 目录结构介绍 2. Linux命令基础 2.1 命令和命令行 2.2 格式 3. 常用命令 3.1 产看目录命令——ls 3.2 通配符 3.3 改变工作目录命令——cd 3.4 查看当前路径命令——pwd 3.5 创建新的目录命令——mkdir 3.6 创建文件目录命令——touch 3.7 查看…...

《使用Gin框架构建分布式应用》阅读笔记:p101-p107

《用Gin框架构建分布式应用》学习第7天&#xff0c;p101-p107总结&#xff0c;总计7页。 一、技术总结 1.StatusBadRequest vs StatusInternalServerError 写代码的时候有一个问题&#xff0c;什么时候使用 StatusBadRequest(400错误)&#xff0c;什么时候使用 StatusIntern…...

014集——c#实现打开、另存对话框(CAD—C#二次开发入门)

如下图所示&#xff0c;运行后实现如下功能&#xff1a; 打开对话框&#xff0c;选择一个文件&#xff0c;并获取文件名变量。 打开另存对话框&#xff0c;输入路径和文件名&#xff0c;获取另存文件名变量。 部分代码如下&#xff1a; public static void Ofd(this Database…...

全面升级:亚马逊测评环境方案的最新趋势与实践

在亚马逊测评领域深耕多年&#xff0c;见证了无数环境方案的更迭与演变&#xff0c;每一次变化都体现了国人不畏艰难、勇于创新的精神。面对平台的政策调整&#xff0c;总能找到相应的对策。那么&#xff0c;当前是否存在一套相对稳定且高效的技术方案呢&#xff1f;答案是肯定…...

Java中的异步编程模型

1.什么是异步编程&#xff1f; 异步编程是一种编程模式&#xff0c;允许程序在等待某些操作&#xff08;例如文件I/O或网络请求&#xff09;完成时&#xff0c;不必停下来等待&#xff0c;而是继续执行其他任务。当异步操作完成时&#xff0c;回调函数或任务调度器会处理结果&…...

opencv 按位操作

opencv位运算说明 按位与&#xff0c;按位或&#xff0c;按位非&#xff0c;按位异或 在 OpenCV 中&#xff0c;按位操作函数的接口一般包括两个或多个图像数组&#xff08;矩阵&#xff09;作为输入&#xff0c;常常还会有一个可选的掩码参数。下面我列出每个函数的具体接口…...

【Bug】STM32串口空闲中断接收不定长数据异常

Bug 使用标准库配置STM32F103C8T6的串口1开启接收中断和空闲中断&#xff0c;通过空闲中断来判断数据发送是否结束&#xff0c;收到数据后切换板载LED灯所接引脚电平&#xff0c;发现LED出现三种情况&#xff0c;熄灭、微亮、正常亮&#xff0c;但是LED灯所接的GPIO引脚为PC13…...

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…...

Java入门4——输入输出+实用的函数

在本篇博客&#xff0c;采用代码解释的方法&#xff0c;帮助大家熟悉Java的语法 一、输入和输出 在Java当中&#xff0c;我们一般有这样输入输出&#xff1a; import java.util.Scanner;public class javaSchool {public static void main(String[] args) {Scanner scanner …...

《当尼采哭泣》

这是一个相互救赎的故事。故事铺垫比较冗长&#xff0c;看到一半的时候一度看不下去。直到看到最后两章才最终感觉值得一看。很多表层现象&#xff0c;就像露出水面的冰山。解决表面的问题&#xff0c;需要深挖冰山水下的部分。一个人碰到的最难解决的问题不在外部&#xff0c;…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...