java自写数组列表和链表

【Java集合 2】Java链表、散列表、HashSet、TreeSet 从数组中间删除一个元素开销很大,其原因是向数组中插入元素时,此元素之后的所有元素都要向后端移动,删除时也是,数组中位于被删除元素之后的所有元素都要向数组的前端移动。 阅读详情

本文将实现容器的基本功能,增删查减,以及泛型的使用,还会对数组列表和链表做性能的对比。

数组列表

泛型

我们知道,数组列表可以是很多种类型的,在写这个方法的时候,如果我们只写了int类的数组列表,那么这个数组列表就只能实现int类的,如果我们下一次想存储String类型的,就必须要重新写一个几乎一模一样的方法,只不过将类型改变了,泛型则很好地解决了这个问题,下面介绍泛型的使用方法

实现泛型其实很简单,在类或者接口名的后面加上尖括号<>,尖括号内可以为任意字符或字符串,代表一个基本类型,我们习惯用E表示元素elements,此外,将可替代基本类型全部改为尖括号里面的元素,代表一个类,以后实现的时候将这个元素改变为要用的类型就好了

增删查改的基本实现

public interface IList<E> {
	//添加数据
	public void add(E e);
	//删除数据
	public void delete(int index);
	//修改
	public void update(int index, E newE);
	//获取元素
	public E get(int index);
	//获取元素个数
	public int size();
	//添加数组
	public void addarray(MyArrayList<E> marraylist);
	//插入元素,在index之后
	public void insert(E e,int index);
}

提供一个借口,规定方法,之后的数组列表和链表都将实现这个接口。

public class MyArrayList<E> implements IList<E> {
	Object[] myarray;
	
	int num=0;

值得注意的是,泛型并不能创建数组对象,我们用Object来替代泛型的功能,Object是所有类的父类,因此可以储存所有类型的元素

	// 添加数据
	public void add(E e) {
		Object newarray[] = new Object[num + 1];
		for (int i = 0; i < num; i++) {
			newarray[i] = myarray[i];
		}
		newarray[num] = e;
		num++;
		myarray = newarray;
	}

创建一个新的数组,并让它的长度等于原来的长度+1,然后再把原来的数组值赋给新的数组,加上新的元素后,让原来的数组等于新的数组

	// 删除数据
	public void delete(int index) {
		Object newarray[] = new Object[num - 1];
		for (int i = 0; i < index; i++) {
			newarray[i] = myarray[i];
		}
		for (int i = index; i < num-1; i++) {
			newarray[i] = myarray[i+1];
		}
		num--;
		myarray = newarray;
	}

原理同增加一样

	// 修改
	public void update(int index, E newE) {

		Object newarray[] = new Object[num];
		for (int i = 0; i < index; i++) {
			newarray[i] = myarray[i];
		}
		newarray[index] = newE;
		for (int i = index + 1; i < num; i++) {
			newarray[i] = myarray[i];
		}
		myarray = newarray;
	}
	// 获取元素
	public E get(int index) {
		
		return (E)myarray[index];
	}
	// 获取元素个数
	public int size() {
		return num;
	}
	// 添加数组
	public void addarray(MyArrayList<E> marraylist) {
		Object newarray[] = new Object[num + marraylist.num];
		for (int i = 0; i < num; i++) {
			newarray[i] = myarray[i];
		}
		for (int i = 0; i <marraylist.num; i++) {
			newarray[i+num] = marraylist.get(i);
		}
		num+=marraylist.num;
		
		myarray = newarray;
		Arrays.sort(myarray);
	}

	// 插入元素,在index之后
	public void insert(E e, int index) {
		Object newarray[] = new Object[num + 1];
		for (int i = 0; i < index; i++) {
			newarray[i] = myarray[i];
		}
		newarray[index] = e;
		for (int i = index + 1; i < num+1; i++) {
			newarray[i] = myarray[i - 1];
		}
		num++;
		myarray = newarray;
	}

链表

结点

在链表中数据的存储不是连续的,数据与数据之间的联系由一个个结点来实现,一个结点中储存着属性信息,也储存着下一个结点。
在这里插入图片描述

链表的优点

相对于数组列表来说,链表可以很方便地实现新数据的插入,只需要将前一个结点和插入数据的结点连接,然后插入数据结点和后一个结点连接就可以了。而如果数组列表要做这件事的话就必须要将插入点后的数据全部后移一个位置,从性能上来说,链表在插入数据这方面要优于数组列表。

增删查改的实现

public class MyLinkList<E> implements IList<E>{
	private class Node<E>{
		E e;
		Node<E> nextnode;
		public Node() {}
		public Node(E e) {
			this.e=e;
		}
	}

结点储存数据信息和下一个结点

	int size=0;
	Node<E> head=new Node<>(),tail=head;

每链表要有头结点和尾结点,初始设置头结点和尾结点都是同一个且为空值

//添加
	public void add(E e) {
		Node<E> newnode=new Node<>(e);
		tail.nextnode=newnode;
		tail=newnode;
		size++;
	}

默认在末尾添加新数据,让原来的尾结点的下一个结点为新节点,让新节点为尾结点

//删除
	public void delete(int index) {
		Node<E> cur=head.nextnode,pre=head;
		for(int i=0;i<index;i++) {
			pre=cur;
			cur=cur.nextnode;
		}
		pre.nextnode=cur.nextnode;
		size--;
	}
	//更改
	public void update(int index, E newe) {
		Node<E> temp=head.nextnode;
		for(int i=0;i<index;i++) {
			temp=temp.nextnode;
		}
		temp.e=newe;
	}

//获得大小
	public int size() {
		return size;
	}
//添加链表
	public void addlist(MyLinkList<E> mll) {
		this.tail.nextnode=mll.head.nextnode;
		this.tail=mll.tail;
		size+=mll.size;
	}
//插入新数据
	public void insert(E e, int index) {
		Node<E> innode=new Node<>(e);
		Node<E> pre=head.nextnode,cur=pre.nextnode;
		for (int i = 0; i < index; i++) {
			pre=cur;
			cur=cur.nextnode;
		}
		pre.nextnode=innode;
		innode.nextnode=cur;
		size++;
	}
//读取链表
	public E get(int index) {
		Node<E> temp=head.nextnode;
		for (int i = 0; i < index; i++) {
			temp=temp.nextnode;
		}
		
		return temp.e;
	}
5、OpenClaw(龙虾助手)飞书机器人完整对接指南(2026最新版) OpenClaw v2026.2.2+ 版本,防火墙内也能正常工作,是目前最稳定、最简单的企业内部AI助手部署方案。 阅读详情

相关推荐

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 611

Java核心技术——第六章:链表、数组列表、散列集、映射

目录链表并发修改问题数组列表散列集树集 链表 链表(linked list)将每一个对象放在独立的节点中,每个节点还存放着下一个和下一个节点的引用,可以从链表中间轻松添加、删除元素。 List<String> staff = enw LinkList<>(); //添加三个员工 staff.add("anny"); staff.add("bob"); staff.add("candy") Iterator iter = staff.iterator(); String first

weixin_43472800的博客 1143

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1594

Java数据结构————List

在集合框架中,List是一个接口,继承自Collection,并不能直接用来实例化。站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,

qq_45559559的博客 3922

别再为通讯发愁了!手把手教你用PCAN-View调试Kinco步科伺服电机的CANopen

本文详细介绍了如何使用PCAN-View工具调试Kinco步科伺服电机的CANopen通讯,从环境搭建到实战演练,涵盖硬件连接、软件配置及故障排除。通过具体案例和代码示例,帮助工程师快速掌握伺服电机通讯控制技术,解决工业设备通讯难题。

weixin_29189377的博客 266

推荐系统召回总结(持续更新)

推荐系统架构 候选池:可供推荐的物料候选池,对于图文、短视频、新闻等来说通常是最近N天的新物料组成的集合,定期进行物料更新。 召回:从候选池中选出和用户相关的物料,交给后面的排序模块进行打分。召回面对的候选集通常是数十万或者百万甚至千万的量级,检索过程必须轻量快速。通常由多路召回组成,保证不遗漏且相关性、多样性尽量好,可以分为非个性化召回和个性化召回。 粗排:对召回选择的几千或者几百候选物料进行排序,快速打分选出topN,减少精排的压力,兼顾精准与效率。 精排:对粗排的结果进行精准排序,这个环节需要特征尽可

whgyxy的博客 2515

数据结构中链表和列表的区别

顺序表和链表由于存储结构上的差异,导致它们具有不同的特点,适用于不同的场景。通过系统地学习顺序 表和链表我们知道,虽然它们同属于线性表,但数据的存储结构有本质的不同。 • 顺序表存储数据,需预先申请一整块足够大的存储空间,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙 • 链表的存储方式与顺序表截然相反,什么时候存储数据,什么时候才申请存储空间,数据之间的逻辑关系依靠每个数据元素携带的...

Java进阶(一刀999) 1万+

EBSD数据转ABAQUS的inp文件实操指南

晶体塑性有限元模拟中,如何将材料微观组织表征数据转化为可计算的有限元模型,是连接实验与仿真的关键环节。EBSD技术能够获取材料表面的晶体取向、晶粒形貌和晶界分布信息,但这类数据需要经过格式解析、欧拉角转换、网格生成等步骤,才能被ABAQUS等有限元软件读取。通过将扫描点坐标映射为节点、按像素邻域生成单元,并将Bunge约定欧拉角变换为局部坐标系方向余弦,用户可以准确构建包含真实微观结构的inp文件模型。这一流程广泛应用于金属材料形变、织构演化及应力集中分析等研究场景,有效提升仿真结果与实验的一致性。围绕数据

weixin_42509513的博客 312

数组和链表的区别

数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点。大致总结一下特点和区别,拿几个人一起去看电影时坐座位为例。数组的特点 在内存中,数组是一块连续的区域。 拿上面的看电影来说,这几个人在电影院必须坐在一起。 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。 比如看电影时,为了保证10个人能坐在一起,必须提前订好10个连续的位置。这样的好处就是能保证1

喵了个呜的博客 9万+

毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行

毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行

356

ENVI无法打开Landsat8的头文件问题和解决

再次将txt文件拖入ENVI中,就会得到7个波段组合后的真彩色图像,而且辐射定标所需的参数信息都已经定义好了。按住CTRL+F,查找GROUP = LEVEL1_PROCESSING_RECORD。第一行GROUP = LANDSAT_METADATA_FILE。会查到两个包含的句子,把这两个中间的部分全部删掉。双击打开该xxx_MTL.txt的头文件。删除空行后,应该为如下图的样子。把LANDSAT改为L1。

所有专家都曾始于新手 9702

Java实现链表

         单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。(逻辑地址相连,物理地址不相连) 我们来用java的内部类来实现单链表的创建 class Link{//一个链表类 publi...

小仙女的博客 3万+

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 587

Java-03

Java-03

Xiao__fly的博客 487

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构与算法】Java中的基本数据结构:数组、链表、树、图、散列表等。

在本文中,我们将深入探讨Java集合框架中的核心数据结构,包括数组、链表、树、图、散列表、栈、队列、集合、映射和优先队列。通过分析每种数据结构的实现原理和特点,你将学会如何根据具体需求选择合适的数据结构,从而提升程序的性能和效率。文章还包含了Java代码示例和流程图,帮助你更好地理解和应用这些数据结构。

Dylaniou的博客 2540

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java的列表、集合、数组的添加一个元素各自用的什么方法?

Java 中除了列表(List)、集合(Set)和数组(Array)之外,还有其他多种数据结构支持元素的添加操作。如果需要更具体的实现细节或线程安全方案,可进一步查看相关类的官方文档或源码实现。Java 标准库未直接提供树结构,但可通过。数组是固定长度的数据结构,添加元素通常需要。双端队列支持从两端添加元素,实现类为。如需动态处理大量元素,推荐优先使用。向量是线程安全的动态数组,使用。映射存储键值对,常用实现类为。

胸纳甲兵,烽烟起可靖疆晏海。 2069

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

一文搞懂Java中数组和链表的区别:从原理到使用场景

如果你需要快速查找,数据量固定或变化不大,选数组;如果你需要频繁增删,数据量动态变化,选链表。理解了这些区别,以后在写代码时就能根据实际需求选择更合适的数据结构,让程序运行得更快更高效!😊。

全栈开发工程师 1831

数组和链表

定义 数组和链表都属于“线性表”,也就是数据排列成一条线一样的结构,线性表,只有前后两个方向。 数组 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 因为需要连续的内存空间,所以即使内存中宗空间足够大,但是只要不是连续的,数组就不能成功申请到内存。也就是说只要知道数组中第一个对象的位置,我们可以很轻易的通过偏移量来定位数组中其他数据的位置。 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。 链表比数组

盖丽男 1103

Java数组列表和链表的自定义写法

数组列表 由于数组的长度是固定的,所以为了能够做到在增删改查,我们数组创建了一个数组列表。 用数组写数组列表思路: 如果是添加一个元素,就创建一个新的数组比原来的长度大一个单位,把所有之前的元素一个个遍历到新的数组中,然后添加新的元素到最后的位置。 添加元素的实现: public class DesignArrList implements DesignList{ int size; Object [] arry = new Object[size]; public void add(Object

weixin_53010850的博客 340

【JAVA-通过List<E>接口实现数组与链表】

查看原有的List方法,查看其中代码,然后用java实现一个List 接口类,选择原有List中的大部分方法,利用此接口实现数组以及链表。

ZERO_HOPE的博客 1138

数组和链表的区别_数组 vs 链表,到底哪个性能更强?

数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻烦。而本文则会从执行过程图以及性能评测等方面入手,让你更加深入的理解和记忆二者的区别,有了这次深入的学习之后,相信会让你记忆深刻。数 组在开始(性能评测)之前我们先来回顾一下,什么是数组?数组的定义如...

weixin_39563722的博客 3205

java-数组、链表、散列表

1、数组、链表、散列表 --数组 (1)数组在内存中都是相连的, (2)当数组进行查询操作的时候,可以根据索引直接定位到需要查询的元素。 (3)进行插入操作的时候,则需要考虑具体情况,如果数组后面的内存被占了,则数组需要整体移动,重新寻找一块连续的可以放下该数组的内存,如果符合要求的内存找不到的话,插入会报错。 (4)删除操作始终都会成功,但是删除中间元素的时候,后面的元素会整体向前移动。 总结: 数组优点:因为数组在内存中是连续的,并且有对应的索引,所以查询很快 缺点:插入和删除会移动元素,所...

m0_37738029的博客 234

Java中的链表、数组、散列集

1.链表 链表的特性: 1.在Java中所有的链表其实都是双向链表,也就是每一个节点都保存了前驱节点和后继节点的索引。 2.高效的插入和删除 3.低效的随机访问 4.在Java中LinkedList是一个有序的集合 ListIterator: ​ 集合类库中专门提供的一个List的迭代器叫做ListIterator,这个迭代器中的add方法没有返回值,这是因为List下的两个实现类:ArrayList 和 LinkedList 都可以动态增加长度,不存在添加不进去的情况; ​ ListIterator中

记录一只菜鸡的成长之路 380

秋招复习之数组与链表

复习数组和链表,包括数组链表和列表,以及他们的一些基本操作,这里主要写的Java和cpp语言。语言真的烦的很,不同的项目就要用不同的语言,所以都复习一下,但是很容易搞混。

m0_66076989的博客 988

Java-数组和链表(ArrayList和LinkedList)

一、数组和链表 1、数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组 中任何元素。 但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 增加的元素放在其中。 同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。 如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。 2、链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系 到一起 比如:上一个元素有个指针指到下一个元

MinggeQingchun的博客 2718

[python] 列表与数组

小结: Python最基本的数据结构是序列,对应有Python内置数据类型 列表和元组。Python原生没有数组的概念,这一点不同于Java之类的面向对象语言。 Python中原生的列表虽然使用方法与数组类似,但它们之间有本质区别。 Python的列表不需要指定列表长度、数据类型。可以进行索引,切片,更新,删除,切片等操作。 Python可以通过 import array 或者import n...

Alin_Zhang 1万+
上一篇: 彻底解决java传参问题
下一篇: 实验一线性表(字符串分类统计)
南懿烨曦
博客等级 码龄6年 108粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值