【Java版数据结构】初识泛型
看到这句话的时候证明:此刻你我都在努力
 加油陌生人
 
 br />个人主页:Gu Gu Study
专栏:Java版数据结构
 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹
 
喜欢的话可以点个赞谢谢了。
 作者:小闭
前言
好久没有更新文章了,大概断更了20天,想着今天就写一下文章吧!最近也是又温习了一下数据结构,其实之前我写过关于数据结构的一个专栏那个专栏是写了顺序表,链表,栈和队列,但是那时是用C语言实现的,虽然数据结构不局限于语言,但是总归在语言的使用上有所不同,毕竟面向不同,一个是面向过程的C语言,一个是面向对象的Java。所以这次我打算起一个数据结构的Java专栏,当然由于之前已经写过有些地方会写得简洁一点,模糊的话大家可以去看一下前面得文章哦。今天是关于泛型的哦!只是简单的认识一下基础,为了更好的理解后面Java使用数据结构的代码。
认识包装类
Java中,包装类(Wrapper Classes)是用来包装原始数据类型的类。Java是一种面向对象的语言,所有的对象都是类的实例,包括基本数据类型。但是基本数据类型并不是对象,它们是Java语言的一部分,而不是Java类。为了将基本数据类型当作对象来处理,Java提供了对应的包装类。
 以下是Java中的基本数据类型及其对应的包装类:
**boolean**** - ****Boolean****byte**** - ****Byte****short**** - ****Short****int**** - ****Integer****long**** - ****Long****float**** - ****Float****double**** - ****Double****char**** - ****Character**
很容易看出来除了int和char的包装类有些特殊其它基本数据的包装类就是大写其第一个字幕。
 包装类的主要作用包括:
- 自动装箱和拆箱:Java 5 引入了自动装箱(Autoboxing)和拆箱(Unboxing)的概念,允许自动将基本数据类型转换为对应的包装类对象,反之亦然。
 - 使用对象的方法:包装类提供了一些有用的方法,比如
toString()、equals()、hashCode()等,这些在基本数据类型中是不可用的。 - 集合框架:Java的集合框架只能存储对象,不能直接存储基本数据类型。通过包装类,可以将基本数据类型作为对象存储在集合中。
 - 方法参数:在定义方法时,如果需要一个可变参数,可以使用包装类,因为基本数据类型是不可变的。
 
在数据结构中我们主要运用第三点集合框架,集合框架,后面的文章会给大家讲到。
自动装箱和拆箱的使用
以下就是自动装箱和拆箱的使用方法:
 如果将num1和num2打印出来,都是一样的值----5。
public class Test {public static void main(String[] args) {Integer num1 = 5; // 自动装箱int num2 = num1; // 自动拆箱System.out.println(num1);System.out.println(num2);}
}
 

 包装类还提供了一些静态方法,比如Integer.valueOf(int i)用于将基本类型转换为包装类对象,
 Integer.parseInt(String s)用于将字符串转换为基本类型。这些方法在处理数值与字符串之间的转换时非常有用。将字符串转化为整形其实我们前面在讲字符串时也是讲过的。
 了解完包装类接下来就是我们的泛型学习了。
泛型的概念
泛型是Java中一种强大的特性,它允许程序员在编写代码时指定类型参数,从而使得代码更加灵活和可重用。泛型提供了一种方式,使得编译器可以在编译时检查类型安全,避免了类型转换的错误和运行时的类型检查。
当当看概念可能比较抽象,下面我们引出一个情境:
- 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new
String[10]; 
那么如果我想要一个什么类型都能储存的数组可以吗?
 其实这是可以实现的,那么我们这里就要提到object类了。
 所有类的父类,默认为Object类。数组是否可以创建为Object?
 答案是可以的,如下代码,在自己定义了一个MyArray后,我们就可以在里面储存各种类型的数据了。
class MyArray {Object[] array = new Object[10];public void setVal(int pos, Object val) {array[pos] = val;}public Object getVal(int pos) {return array[pos];}}public class Test {public static void main(String[] args) {MyArray myArray=new MyArray();myArray.setVal(0,2);myArray.setVal(1,"hello world");int ret1=(int)myArray.getVal(0);        //注意这里必须进行强制类型转换String ret2=(String)myArray.getVal(1);   //注意这里必须进行强制类型转换System.out.println(ret1);System.out.println(ret2);}}
 
但是数组的定义本来就是用来储存同种类型数据的一种集合。像上面这种却又不像是数组呢。
 下面我们在引入一个情境:
 我在定义一个容器时暂时不知道用什么数据类型怎么办,我在用到时才知道这个容器要用什么类型的数据,这时我们该怎么办呢?这时我们的主角泛型就该出场了。
泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
 那么下面就来细看泛型的使用
 语法:
 ** class 泛型类名称<类型形参列表> { **
 **// 这里可以使用类型参数 **
 }
那么类型参数列表是什么呢?
 ** 其实我们可以理解为一个占位符,我们用一个字母来代表他是一个类型的数据,至于这具体是什么我们定义这个类时是不知道的,但是这时我们可以在这个类中先使用这个未知的类型进行一系列操作,当我们在实例化new一个对象出来时才可以传入自己想要使用的参数类型。**
 泛型的使用如下代码:
class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}public class Test {public static void main(String[] args) {Box<Integer> box=new Box<>();box.set(6);System.out.println(box.get());}}
 
在上面代码中我们定义一个泛型类Box,在实例化时我们需要如上 Box box=new Box<>();那么这个类中的T,那么全部转化为Integer了,所以在传入类型实参时通常是一个类,即:这里的Integer不能是int,这就是我们为什么要先学习包装类。
 这个泛型类就是我们数据结构最常用的泛型知识点。
泛型的上界
首先我们先了解什么是泛型上界
 泛型上界是泛型编程中的一个重要概念,它用于指定泛型参数可以继承或实现的类或接口的类型范围。在Java等支持泛型的语言中,上界允许你限制泛型参数必须是某个类或接口的子类或实现。
 其语法为:
 ** class 泛型类名称<类型形参 extends 类型边界> { **
 ······
 **} **
代码例子
public class MyArray<E extends Number> {
...
}
 
**那么这时我们的传入的类型变量就必须为Number的子类 **
 MyArray n1; // 正常,因为 Integer 是 Number 的子类型
 MyArray n2; // 编译错误,因为 String 不是 Number 的子类型
泛型方法
语法形式:
 **方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { **
 **… **
 **} **
 代码示例:
 public class Util { 
//静态的泛型方法 需要在static后用<>声明泛型类型参数 
public static<E>  void swap(E[] array, int i, int j) { 
E t = array[i];array[i] = array[j]; 
array[j] = t;} 
} 
 
** 那么这时我们使用泛型方法时通常有两种方式:**
 ** 一、可以自动进行类型推导: **
 Integer[] a = { ... }; 
swap(a, 0, 9); String[] b = { ... };swap(b, 0, 9);  
 
** 二、 不使用类型推导 **
 Integer[] a = { ... }; 
Util.swap(a, 0, 9); String[] b = { ... }; 
Util.swap(b, 0, 9) 
 
以上就是泛型的简单介绍,泛型的知识还有很多,但是我们这次只学习一些基础唔。主要是为了后面数据类型的打基础铺垫。
相关文章:
【Java版数据结构】初识泛型
看到这句话的时候证明:此刻你我都在努力 加油陌生人 br />个人主页:Gu Gu Study专栏:Java版数据结构 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者࿱…...
DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)
使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S:DevExpress WinForms拥有180组件和UI库&a…...
vue中v-if和v-for
vue中v-if和v-for Vue 官方建议不要在同一个元素上同时使用 v-if 和 v-for 指令,主要有以下几个原因: 性能问题: 当 v-if 和 v-for 一起使用时,Vue 在每次渲染时都需要先执行循环,然后再对每个元素进行条件判断。这可能…...
【MySQL】根据binlog日志获取回滚sql的一个开发思路
根据binlog日志获取回滚sql的一个开发思路 需要获取的信息 thread_id 打开 mysql 客户端 开始时间 关闭 mysql 客户端 结束时间 binlog 匹配流程 指定 mysql 客户端 开始时间和结束时间 先匹配 thread_id 相同的 然后匹配 ^BEGIN$行和 ^COMMIT/*!*/;$行之间的数据 当匹…...
Kafka快速入门+SpringBoot简单的秒杀案例
1. 主题相关 1.1 创建主题 kafka-topics.sh --create --bootstrap-server [服务器地址] --replication-factor [副本数] --partitions [分区数] --topic [主题名]liberliber-VMware-Virtual-Platform:/home/zookeeper$ docker-compose exec kafka /bin/bash #进入kafka容器 b…...
Redis哨兵机制
哨兵机制: (1)监控:有一个哨兵集群,这个哨兵集群检测redis的主从集群。它是每隔1秒钟就向主从集群中的节点发送心跳,如果节点没有回复,则这个哨兵就主观的认为这个节点发生故障,这时…...
OSPF概述
OSPF OSPF属于内部网关路由协议【IGP】 用于单一自治系统【Autonomous System-AS】内决策路由 自治系统【AS】 执行统一路由策略的一组网络设备的组合 OSPF概述 为了适应大型的网络,OSPF在AS内划分多个区域 每个OSPF路由器只维护所在区域的完整的链路状态信息 …...
CSS学习笔记[Web开发]
CSS学习 本文为学习笔记,参考菜鸟和w3c 文章目录 CSS 简介CSS 插入外部 CSS内部 CSS行内 CSS多个样式表层叠顺序 CSS 语法例子解释 CSS 选择器CSS 元素选择器CSS id 选择器实例CSS 类选择器实例CSS 通用选择器实例CSS 分组选择器CSS 后代选择器CSS 子元素选择器CSS …...
Go基础编程 - 11 - 函数(func)
接口(interface) 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用(defer)4.1 defer特…...
Typora入门
标题(clrt数字) 段落 实现换行 1.在一个行的结尾加上两个空格实现换行 2.在两行之间加上空行实现换行 实现分割线 (1.***三个星号实现分割线) (2.三个以上的—也可以实现分割线) 强调 斜体:我是斜体 (单下划线…...
PT2262-IR
PT2262是一款很古老的编码芯片,其兼容型号有:SC2262,AD2262,SC2260(需改变匹配电阻)等。 依据其datasheet,PT2262射频模式工作原理: CODE BITS A Code Bit is the basic component of the encoded waveform, and ca…...
JavaScript 迭代器
在JavaScript中,迭代器是一种允许我们遍历集合中元素的对象。迭代器对象具有一个next()方法,该方法返回value和done。value是当前迭代的值,done属性是一个布尔值,表示是否到达了集合的末尾。 迭代器协议 一个迭代器对象必须具备以…...
数据结构之《队列》
在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈,在本篇中我们将继续学习另一种线性表的结构——队列,在通过本篇的学习后,你将会对栈的结构有充足的了解,在了解完结构后我们还将进行栈的实现。一起…...
【NPU 系列专栏 2 -- NVIDIA 的 H100 和 H200 是什么?】
请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 芯片NVIDIA H100 芯片简介NVIDIA H100 主要特点NVIDIA H100 应用场景NVIDIA H100 使用举例NVIDIA H200 芯片简介NVIDIA H200 主要特点NVIDIA H200 应用场景NVIDIA H200 使用举例Summary NVIDIA H100 和 H20…...
【BUG】已解决:IndexError: positional indexers are out-of-bounds
IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…...
视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案
现在视频汇聚,视频融合和视频互动,是视频技术的应用方向,目前客户一般有很多视频的业务系统,如已有GB28181的监控(GB现在是国内主流,大量开源接入和商用方案),rtsp设备,音…...
SpringCloud断路器的使用与原理解析
Spring Cloud断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。 Spring Cloud断路器的使用与原理解析如下: 一、使用断…...
结构型模式-分类
一、结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成…...
【前端】JavaScript入门及实战106-110
文章目录 106 a的索引问题107 使用DOM操作CSS108 读取元素当前的样式109 getStyle()110 其他样式操作的属性滚动条练习 106 a的索引问题 <!DOCTYPE html> <html> <head> <title></title> <meta charset"utf-8"> <script typ…...
git 版本回退-idea
1、选中项目,右键,打开 git历史提交记录 2、选中想要回退的版本,选择 hard(不保留版本记录) 3、最终选择强制提交(必须强制) OK,搞定...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
