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

Java学习历程17——利用泛型优化自定义动态数组

上次我们对自定义数组进行了第一次优化,解决了数组添加数据速度慢的问题,但是数组还存在缺陷:只能添加事先规定的一类数据,而不能根据需求添加不同类型的数据。今天我们利用泛型优化自定义动态数组。

要想数组可以添加所有类型的数据,就必须改变数组的类型。之前的知识告诉我们:Object是Java中所有类的父类,如果把数组类型设置为Object,那么数组就可以容纳任何的数据。这里需要注意一个细节:理论上Object类型的数组只能保存引用类型,但所有的基本类型都不是引用类型,之所以能将基本类型的数据添加进Object数组中,是因为添加时基本数据类型会自动转变成对应的包装类。综上所述,我们只需要将数组类型和方法中数据data的类型改成Object就可以添加任何类型的数据了!

效果如下图:

但是我们又遇到了一个问题:如果一个数组什么类型的数据都能随意添加进去,数组就会变得很凌乱,不利于数据的分类保存,所以我们希望能够让数组根据输入的内容只能添加一种类型,这是就要用到泛型的内容。

我们需要在类ArrayList后面加上一个尖括号<>,表示该类为泛型,里面需要填写名字,一般命名为T、E、K、V等(需要有语义)。数组类型依然为Object不变,但需要把方法的参数里的data类型改为对应的名字,表示只能是这个类型的数据添加到数组中。

代码

//尖括号表示泛型,目的是实现只能添加一种元素的功能。//尖括号里的数据类型只能是包装类,不能是基本数据类型
public class ArrayList<E> {public Object[] Arr;private static int length = 10;//定义一个变量保存数组中的有效数据个数private int size;//使用构造方法写两个数组的使用方法public ArrayList() {//默认数组的长度为10Arr = new Object[length];}public ArrayList(int len) {//手动定义数组的初始长度Arr = new Object[length];}//末尾添加数据public void add(E data) {//判断是否需要扩容if (size == Arr.length) {//两倍扩容数组Object[] nArr = new Object[Arr.length * 2];for (int i = 0; i < Arr.length; i++) {nArr[i] = Arr[i];}//更改内存地址Arr = nArr;}//数据添加到末尾Arr[size] = data;size++;}//插入数据public void add(E data, int index) {//判断数组是否需要扩容if (size == Arr.length) {//两倍扩容数组Object[] nArr = new Object[Arr.length * 2];//从index 位置开始,把后面的数据往后移动for (int i = 0; i < index; i++) {nArr[i] = Arr[i];}for (int i = index; i < Arr.length; i++) {nArr[i + 1] = Arr[i];}Arr = nArr;Arr[index] = data;size++;} else if (size < Arr.length) {for (int i = index; i < size; i++) {Arr[i + 1] = Arr[i];}Arr[index] = data;size++;}}//获取指定位置的数据public E get(int index) {if (index < 0 || index > Arr.length) {System.out.println("下标越界!!!");return null;} else {return (E)Arr[index];}}//移除指定位置的数据public E remove(int index) {Object removeData = Arr[index];for (int i = index; i < size; i++) {Arr[i] = Arr[i + 1];}size--;return (E)removeData;}//移除指定的数据public boolean removes(E data) {boolean gs=false;for (int i = 0; i < Arr.length; i++) {if (Arr[i]==data ) {remove(i);gs= true;}}return gs;}//获得数组的长度public int getSize() {return Arr.length;}public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();//添加整型数据list.add(1);list.add(2);list.add(3);list.add(5);list.add(6);list.add(7);list.add(8);list.add(9);list.add(10);list.add(11);list.add(4, 3);list.removes(2);for (int i = 0; i < list.size; i++) {System.out.print(list.get(i) + " ");}}
}

这样,我们就能实现只能在数组中添加同一种数据的功能了!

补充知识

1、泛型

在Java中,我们用尖括号<>表示泛型,可以把添加到动态数组(集合)中的类型参化,里面需要输入引用类型或者基本类型对应的包装类。将基本数据类型变成包装类的过程叫做装箱

作用:限制必须是同类型的数据才能添加到同一个集合对象中。

2、基本数据类型及其对应的包装类

基本数据类型对应的包装类
byte(整型)Byte
short(整型)Short
int(整型)Integer
long(整型)Long
float(浮点型)Float
double(浮点型)Double
char(字符)Character
boolean(布尔型)Boolean

http://www.dtcms.com/a/358494.html

相关文章:

  • 深度学习入门,基于python的理论与实现
  • PostgreSQL WAL机制深度解析与优化
  • 如何简单建设一个网站,让用户快速找到你。
  • 【物联网】BLE 系统架构全景图
  • 常量指针与指针常量习题(一)
  • Swift 解法详解:LeetCode 367《有效的完全平方数》
  • Notepad++使用技巧1
  • 2025-08-18面试题(nginx,mysql,zabbix为主)
  • C#正则表达式与用法
  • unity学习——视觉小说开发(二)
  • JsMind 常用配置项
  • Qt中的锁(1)
  • AFSIM仿真工具介绍与源码编译
  • Isaac Lab Newton 人形机器人强化学习 Sim2Real 训练与部署
  • uniapp监听物理返回按钮事件
  • 软考 系统架构设计师系列知识点之杂项集萃(136)
  • 将 Logits 得分转换为概率,如何计算
  • SRE命令行兵器谱之三:grep - 日志海洋中的“精确制导”
  • JavaWeb前端06(ElementPlus快速构建网页)
  • IDM手机端,速度能提高6倍!
  • 消息队列核心技术解析与应用场景
  • JAVA EE初阶 4:文件操作和IO
  • 使用 SVM(支持向量机)进行图像分类:从读取图像到训练与分类的完整流程
  • Python API接口实战指南:从入门到精通
  • HarmonyOS三方库的使用
  • Java SpringAI应用开发面试全流程解析:RAG、流式推理与企业落地
  • 【Java工程师面试全攻略】Day13:云原生架构与Service Mesh深度解析
  • 防火墙技术(二):安全区域
  • 【Linux】系统部分——软硬链接动静态库的使用
  • Tomcat 企业级运维实战系列(四):Tomcat 企业级监控