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;
	}
Python 逆向解析知乎盐选反爬字体,实现内容精准还原 本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。 阅读详情

相关推荐

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 512

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

基于Multisim的智能交通灯控制系统仿真与实现(含动态闪烁功能)

本文详细介绍了基于Multisim的智能交通灯控制系统仿真与实现,重点解析了动态闪烁功能的电路设计。通过555定时器、74LS192计数器和JK触发器等核心模块,实现了主干道与支干道的交替通行及黄灯1Hz闪烁功能,为交通灯控制系统设计提供了完整的仿真方案。

weixin_29174013的博客 426

Java数据结构————List

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

qq_45559559的博客 3922

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

EDEM在农业机械设计中的实战应用:以谷物收割机优化为例

本文以谷物收割机优化为例,详细阐述了EDEM离散元仿真软件在农业机械设计中的实战应用。通过构建精准的“数字谷物”模型与农机部件动态界面,利用GPU加速完成大规模颗粒系统仿真,有效诊断并解决了籽粒夹带损失与清选负荷不均等田间难题,实现了从仿真分析到田间验证的设计优化闭环。

weixin_29256771的博客 110

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

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

Java进阶(一刀999) 1万+

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

数组和链表的区别

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

喵了个呜的博客 9万+

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2467

python pyusb与硬件 下位机通信

python pyusb 与硬件 下位机 通讯

yuhang01的博客 952

Java实现链表

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

小仙女的博客 3万+

PCL 三维重建 基于B样条曲线的曲面重建算法

本文将介绍如何使用B样条曲线进行三维点云数据的曲面重建。B样条曲线和曲面是一种强大的数学工具,在计算机图形学、CAD设计等领域中广泛应用。通过对点云数据进行曲面拟合和优化,最终得到精确的曲面模型。本示例展示了如何利用PCL中的B样条曲线拟合算法进行三维曲面重建,并对重建结果进行可视化。

纵马踏花向自由 658

Java-03

Java-03

Xiao__fly的博客 487

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

Dylaniou的博客 2540

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

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

一文搞懂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实现自定义数组列表

Java数组列表和单链表目录如何创建自定义数组列表功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目录 Java中AraayList是一种可存储用户自定义数据类型的动态数组,今天我们试着创建一个自定义数组列表实现ArrayList

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值