【Java版数据结构】初识泛型

看到这句话的时候证明:此刻你我都在努力
加油陌生人
微信图片编辑_20240229212205.png
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的包装类有些特殊其它基本数据的包装类就是大写其第一个字幕。
包装类的主要作用包括:

  1. 自动装箱和拆箱:Java 5 引入了自动装箱(Autoboxing)和拆箱(Unboxing)的概念,允许自动将基本数据类型转换为对应的包装类对象,反之亦然。
  2. 使用对象的方法:包装类提供了一些有用的方法,比如toString()equals()hashCode()等,这些在基本数据类型中是不可用的。
  3. 集合框架:Java的集合框架只能存储对象,不能直接存储基本数据类型。通过包装类,可以将基本数据类型作为对象存储在集合中。
  4. 方法参数:在定义方法时,如果需要一个可变参数,可以使用包装类,因为基本数据类型是不可变的。

在数据结构中我们主要运用第三点集合框架,集合框架,后面的文章会给大家讲到。

自动装箱和拆箱的使用

以下就是自动装箱和拆箱的使用方法:
如果将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);}
}

image.png
包装类还提供了一些静态方法,比如Integer.valueOf(int i)用于将基本类型转换为包装类对象,
Integer.parseInt(String s)用于将字符串转换为基本类型。这些方法在处理数值与字符串之间的转换时非常有用。将字符串转化为整形其实我们前面在讲字符串时也是讲过的。
了解完包装类接下来就是我们的泛型学习了。

泛型的概念

泛型是Java中一种强大的特性,它允许程序员在编写代码时指定类型参数,从而使得代码更加灵活和可重用。泛型提供了一种方式,使得编译器可以在编译时检查类型安全,避免了类型转换的错误和运行时的类型检查。


当当看概念可能比较抽象,下面我们引出一个情境:

  1. 我们以前学过的数组,只能存放指定类型的元素,例如: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一个对象出来时才可以传入自己想要使用的参数类型。**image.png
泛型的使用如下代码:

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) 

以上就是泛型的简单介绍,泛型的知识还有很多,但是我们这次只学习一些基础唔。主要是为了后面数据类型的打基础铺垫。

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

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

相关文章

指针数组模拟二维数组

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 指针数组&#xff0c;是数组&#xff0c;但是它的元素都是指针。 #define _CRT_SECURE_NO_WARNING #include <stdio.h> int main(void) {int a 3;int b 4;int c 5;int* arr[3] { &a,&b,…

STM32的外部中断详解

一、什么是中断&#xff1f; 想象一下你正在家里做饭&#xff0c;突然门铃响了&#xff0c;你听到门铃声后&#xff0c;会暂时放下手中的事情&#xff08;比如炒菜&#xff09;&#xff0c;去开门看看是谁。在这个例子中&#xff0c;门铃声就是一个“中断”&#xff0c;它打断…

【C语言】 二叉树创建(结构体,先序遍历,中序遍历,后续遍历)

二叉树的创建&#xff1a;首先先定义一个结构体&#xff0c;里面包含数据&#xff08;data&#xff09;&#xff0c;指向左子树的指针&#xff08;L&#xff09;&#xff0c;指向右子树的指针&#xff08;R&#xff09;三个部分 在创建树的函数中&#xff0c;首先先输入…

HCIP作业3——MGRE综合实验

一、实验及拓扑 二、实验步骤 1、配置IP R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]int s4/0/0 [R1-Serial4/0/0]ip add 15.1.1.1 24 [R1-Serial4/0/0]quitR2 [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 192.16…

qt国际化

1.pro文件里添加那个…ts. 2.开始-qt-qtxxxfor mingw.然后切换到pro所在的目录。 3.输入lupdate testguojihua.pro,会发现生成一个.ts的文件 4.开始–qt–Linguist,然后打开那个文件。 5.选择文件-发布&#xff0c;就能找到.qm文件了 6.使用这个qm文件

SpringBoot 使用easypoi.excel实现导入解析数据,并结合数据字典实现对数据的校验

在日常开发工作中避免不了的功能需求&#xff1a;导入Excel文件&#xff0c;然而导入文件流操作、对数据的校验有是件麻烦事&#xff0c;自从接触了easypoi后&#xff0c;觉得封装的很好&#xff0c;很简洁。 使用的主要依赖如下&#xff1a; <dependency><groupId&…

Spring -- 使用XML开发MyBatis

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 MyBatis XML配置文件开发配置连接字符串和MyBatis写Mapper层代码添加mapper接口添加UserInfoXmLMapper.xml 操作数据库INSERTDELETE & UPDATE MyBatis XML配置文件开发 实际上,除…

谷粒商城实战笔记-64-商品服务-API-品牌管理-OSS前后联调测试上传

文章目录 1&#xff0c;拷贝文件到前端工程2&#xff0c;局部修改3&#xff0c;在品牌编辑界面使用上传组件4&#xff0c;OSS配置允许跨域5&#xff0c;测试multiUpload.vue完整代码singleUpload.vue完整代码policy.js代码 在Web应用开发中&#xff0c;文件上传是一项非常常见的…

USB描述符实例和介绍

具体的描述符每个字节的含义可参考USB2.0协议 一个标注的描述符集合 /*********************************/ 设备描述符[18]{0x12, //固定 bLength字段。设备描述符的长度为18(0x12)字节0x01, //固定 bDescriptorType字段。设备描述符的编号为0x010x10,0x01, //bcdUSB字…

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册&#xff0c;并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片&#xff0c;点击x号后要删除掉当前的图片&#xff0c;那么我们设计的时候如果我们代码写成如下的格式 …

【C语言】栈的实现(数据结构)

前言&#xff1a; 还是举一个生活中的例子&#xff0c;大家都玩过积木&#xff0c;当我们把积木叠起来的时候&#xff0c;如果要拿到最底部的积木&#xff0c;我们必须从顶端一个一个打出&#xff0c;最后才能拿到底部的积木&#xff0c;也就是后进先出&#xff08;先进后出&a…

硬件厂家行业进销存系统开发之门票预约,源码解析css样式

采用技术未来之窗web行业应用弹窗对话框artDialog 未来之窗web行业应用弹窗对话框artDialog: 网页弹窗&#xff0c;独立使用单文件版本&#xff0c;可指定位置&#xff0c;左上&#xff0c;左下&#xff0c;中间&#xff0c;右侧&#xff0c;下册&#xff0c;左侧&#xff0c;…

音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版

Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xf…

做一个能和你互动玩耍的智能机器人之一

2024年被很多人称为AI元年&#xff0c;其实AI元年的叫法由来以久&#xff0c;近年来每一次AI技术的进步&#xff0c;都有很多圈内人大呼AI元年&#xff0c;但不仅一直风声不大&#xff0c;雨点也偏小&#xff0c;都是小范围交流。 得益于软硬件的进步&#xff0c;AI今年开始侵…

深度学习系列70:模型部署torchserve

1. 流程说明 ts文件夹下&#xff0c; 从launcher.py进入&#xff0c;执行jar文件。 入口为model_server.py的start()函数。内容包含&#xff1a; 读取args&#xff0c;创建pid文件 找到java&#xff0c;启动model-server.jar程序&#xff0c;同时读取log-config文件&#xff…

数据库表结构创建

一、原型图 二、分析 1、天气&#xff0c;值字段只有实测值&#xff0c;可用一个字段表示&#xff08;单位、来源同上&#xff09; 2、气温有默认值与实测值两个选项&#xff0c;一个字段无法表示默认值与实测值&#xff08;单位&#xff0c;来源同上&#xff09; 3、因为有…

【Kettle实现神通(数据库)MPP增量、全量数据ETL,同步任务Linux运行(通用)】

1、背景介绍 具体Kettle操作步骤不做过多介绍&#xff0c;主要技术方案说明&#xff0c;Kettle8.2版本放在底部链接提取&#xff0c;本次采用Kettle实现源端&#xff1a;神通数据通用库、目标端&#xff1a;神通MPP增量数据同步&#xff0c;并在服务器端运行Job。 2、windows…

【AIGC】构建自己的谷歌搜索引擎服务并使用

一、谷歌 谷歌的搜索引擎需要自己创建服务才能启用检索api。&#xff08;需自行翻墙和创建自己的谷歌账号&#xff09; 1.1 API服务创建 1&#xff09;登陆https://console.cloud.google.com/: 2&#xff09; 选择新建项目&#xff0c;取号项目名即可&#xff08;比如:Olin…

在 Windows 搭建 flink 运行环境并模拟流数据处理

一、引入 在大数据场景中,开发者追求高效与灵活,Linux 系统以其稳定性成为众多组件的首选,但在资源有限的情况下,在本机搭建一个 Linux 虚拟机集群却显得过于笨重,启动、运行占资源,需要配置网络,无法和windows共享资源,尤其是对只有 8GB 内存的 Windows 系统用户来说…

钙成像数据建模为行为事件

摘要 我在触摸屏盒中记录了小鼠在进行行为学习任务时的钙映像数据。 我想找到一种方法来整合神经数据&#xff08;100 个个体细胞随时间的活动&#xff08;约 30,000 x 约 30 毫秒时间段&#xff09;&#xff09;和行为数据&#xff08;动物在行为任务期间做出的时间戳动作和决…