顺序表的奥秘:高效数据存储与检索

news2024/9/24 21:22:25

🍿顺序表

  • 🧀1、顺序表的实现
    • 🍥1.1 创建顺序表类
    • 🍥1.2 插入操作
    • 🍥1.3 查找操作
    • 🍥1.4 删除操作
    • 🍥1.5 清空操作
  • 🧀2、ArrayList的说明
  • 🧀3、ArrayList使用
    • 🍥3.1 ArrayList的构造
    • 🍥3.2 ArrayList常见操作
    • 🍥3.3 ArrayList的遍历
  • 🧀4、总结

🍳顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改

在这里插入图片描述

🧀1、顺序表的实现

🍥1.1 创建顺序表类

🪄代码示例

public class MyArrayList implements IList{

    public int[] elem;
    public int usedSize;
    // 默认的容量
    public static final int DEFAULT_CAPACITY = 5;
    public MyArrayList() {
        elem = new int[DEFAULT_CAPACITY];
    }
}

🍥1.2 插入操作

🧁(1)添加元素 ,默认添加到数组的最后位置

🪄代码示例

public void add(int data) {
	//1. 判断是否满了 满了要扩容
    if(isFull()) {
		elem = Arrays.copyOf(elem,2*elem.length);
    }
    elem[usedSize] = data;
    usedSize++;
}
public boolean isFull() {
	return usedSize == elem.length;
}

🧁(2)在顺序表的第pos(0 <= pos < usedsize)个位置插入新元素data。若pos的输入的位置不合法,则抛出PosException异常,表示插入失败;否则,将顺序表的第pos个元素及其后的所有元素右移一个位置,腾出一个空位置插入新元素data,顺序表长度增加1,插入成功。

🍋如图:
在这里插入图片描述

🪄代码示例

public void add(int pos, int data) {
	//1.pos位置的判断
    checkPosOfAdd(pos);
    //2. 判断是否满了 满了要扩容
    if(isFull()) {
		elem = Arrays.copyOf(elem,2*elem.length);
    }
    for (int i = usedSize-1; i >= pos ; i--) {
        elem[i+1] = elem[i];
    }
    elem[pos] = data;
    usedSize++;
}
private void checkPosOfAdd(int pos) {
	if(pos < 0 || pos > usedSize) {
		throw new PosException("pos位置为:"+ pos);
    }
}

🍥1.3 查找操作

🧁(1)查找当前元素 是否存在,存在返回true,不存在返回false

public boolean contains(int toFind) {
	for (int i = 0; i < usedSize; i++) {
		if(elem[i] == toFind) {
       		return true;
    	}
	}
	return false;
}

🧁(2)查找当前元素 的下标,找到返回下标,没找到返回-1

public int indexOf(int toFind) {
	for (int i = 0; i < usedSize; i++) {
		if(elem[i] == toFind) {
        	return i;
    	}
	}
    return -1;
}

🧁(3)获取pos位置的值,1、检查pos位置是否合法,不合法就抛出PosException异常,2、检查顺序表是否为空,为空就抛出EmptyException异常

public int get(int pos) {
	//1、检查pos位置是否合法
    checkPosOfGet(pos);
    //2、检查顺序表是否为空
    if(isEmpty()) {
    	throw new EmptyException("顺序表为空");
        //return -1;
    }
    return elem[pos];
}

public boolean isEmpty() {
	return usedSize == 0;
}

private void checkPosOfGet(int pos) {
	if(pos < 0 || pos >= this.usedSize) {
		throw new PosException("pos位置不合法:"+pos);
	}
}

🍥1.4 删除操作

在这里插入图片描述

🧁1、检查顺序表是否为空,为空则抛出EmptyException异常,2、查找该元素所在的下标,3、如图逐一从后面一个一个把前面的元素覆盖掉4、usedseize-1

public void remove(int toRemove) {
	if(isEmpty()) {
		throw new EmptyException("顺序表为空,不能删除");
    }
    int index = indexOf(toRemove);
    for (int i = index; i < usedSize-1; i++) {
		elem[i] = elem[i+1];
    }
    usedSize--;
}

🍥1.5 清空操作

🧁清空顺序表 防止内存泄漏,如果顺序表类存储的不是引用类型元素,直接把usedsize置空,如果是引用类型元素,需要把每个元素都置空

🪄代码示例:

public void clear() {
	usedSize = 0;
}

🧀2、ArrayList的说明

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

🧀3、ArrayList使用

🍥3.1 ArrayList的构造

方法构造
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

🪄代码示例

public static void main(String[] args) {
	// ArrayList创建,推荐写法
	// 构造一个空的列表
	List<Integer> list1 = new ArrayList<>();
	
	// 构造一个具有10个容量的列表
	List<Integer> list2 = new ArrayList<>(10);
	list2.add(1);
	list2.add(2);
	list2.add(3);
	
	// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
	// list3构造好之后,与list中的元素一致
	ArrayList<Integer> list3 = new ArrayList<>(list2);
	
	// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
	List list4 = new ArrayList();
	list4.add("111");
	list4.add(100);
}

🍥3.2 ArrayList常见操作

🍨ArrayList虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,可自行查看ArrayList的帮助文档

方法解释
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List subList(int fromIndex, int toIndex)截取部分 list

🪄代码示例:

public static void main(String[] args) {
	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	list.add("3");
	list.add("4");
	list.add("5");
	System.out.println(list);
	
	// 获取list中有效元素个数
	System.out.println(list.size());
	
	// 获取和设置index位置上的元素,注意index必须介于[0, size)间
	System.out.println(list.get(1));
	list.set(1, 57);
	System.out.println(list.get(1));
	
	// 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置
	list.add(1, "11");
	System.out.println(list);
	
	// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
	list.remove("3");
	System.out.println(list);
	
	// 删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常
	list.remove(list.size()-1);
	System.out.println(list);
	
	// 检测list中是否包含指定元素,包含返回true,否则返回false
	if(list.contains("1")){
		list.add("1");
	} 
	
	// 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找
	list.add("4");
	System.out.println(list.indexOf("4"));
	System.out.println(list.lastIndexOf("4"));
	
	// 使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData数组
	List<String> ret = list.subList(0, 4);
	System.out.println(ret);
	list.clear();
	System.out.println(list.size());
}

🍥3.3 ArrayList的遍历

🍝ArrayList 可以使用三方方式遍历:for循环+下标foreach、使用迭代器

🍋(1)for循环+下标

public static void main(String[] args) {
	List<Integer> list = new ArrayList<>();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);
	// 使用下标+for遍历
	for (int i = 0; i < list.size(); i++) {
		System.out.print(list.get(i) + " ");
	} 
	System.out.println();
}

🍋(2)foreach

// 借助foreach遍历
for (Integer integer : list) {
	System.out.print(integer + " ");
} 
System.out.println();

🍋(3)迭代器

Iterator<Integer> it = list.listIterator();
while(it.hasNext()){
	System.out.print(it.next() + " ");
} 
System.out.println();

🧀4、总结

🍋数据结构
1、顺序表由一系列元素组成,这些元素按照特定的顺序排列。
2、每个元素都有一个唯一的索引,从 0 开始递增。
3、顺序表可以是静态的,意味着它的大小是固定的;也可以是动态的,可以根据需要动态调整大小。

🍋优点
1、实现简单:顺序表的实现非常简单,因为元素存储在连续的内存空间中,可以通过索引直接访问
2、高效的随机访问:由于顺序表的有序存储,可以在 O(1) 的时间复杂度内进行随机访问,即根据索引快速定位元素
3、支持顺序遍历:可以按照顺序遍历整个顺序表,逐个访问元素。

🍋缺点
1、固定大小:静态顺序表的大小是固定的,在创建时就需要指定,如果需要存储更多元素,可能会导致内存不足。
2、插入和删除操作复杂:在顺序表中进行插入和删除操作可能需要移动其他元素,以保持顺序,这会导致时间复杂度较高。
3、不适合大规模数据:顺序表对于大规模数据的处理效率较低,因为需要将所有元素存储在连续的内存空间中。

🎉OK!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️
在这里插入图片描述

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

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

相关文章

jQuery 遍历 —— W3school 详解 简单易懂(十八)

什么是遍历&#xff1f; jQuery 遍历&#xff0c;意为“移动”&#xff0c;用于根据其相对于其他元素的关系来“查找”&#xff08;或选取&#xff09;HTML 元素。以某项选择开始&#xff0c;并沿着这个选择移动&#xff0c;直到抵达您期望的元素为止。 下图展示了一个家族树…

Spring Security的入门案例!!!

一、导入依赖 <dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--security--><dependency><groupId>…

Kubernetes安装Seata1.8.0(注册到Nacos,连接外置数据库)

文章目录 Seata简介效果安装Seata1.8.01、拷贝数据2、修改配置3、初始化数据库4、安装Seata Seata简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户…

CSA大中华区发布《AI安全白皮书》,中国电信、蚂蚁集团、华为、百度安全等单位参编

关注国际云安全联盟CSA公众号&#xff0c;回复关键词“AI”获取报告 2023年9月&#xff0c;CSA大中华区成立AI安全工作组&#xff0c;旨在共同解决 AI 技术快速发展所带来的安全难题。《AI安全白皮书》是CSA大中华区AI安全工作组的首个研究成果&#xff0c;由来自中国电信、蚂…

【计算机网络】——TCP协议

&#x1f4d1;前言 本文主要是【计算机网络】——传输层TCP协议的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句…

Java学习-常用API-ArrayList

ArrayList的遍历并删除元素&#xff08;案例&#xff09;ArrayList的常用apiArrayList是一种泛型集合ArrayList是什么&#xff1f;有何特点&#xff1f;作用&#xff1f; importjava.util.ArrayList; importjava.util.List; publicclassapiArrayListDemo1{ publicstaticvoidmai…

44 漏洞发现-APP应用之漏洞探针类型利用修复

目录 文章思路说明案例演示:抓包工具WEB协议面使用说明抓包工具非WEB协议面使用说明安卓逆向便捷APK一键提取URL演示利用Burp筛选及联动功能打出军体拳模拟器四个违法案例APP安全分析测试 涉及资源&#xff1a; 逆向只会涉及到相关工具的使用&#xff0c;不会涉及到原理&#x…

【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码

目录 论文使用方法weight decayMaxNorm 如果使用原来的代码报错的可以看下面这个 论文 问题&#xff1a;真实世界中普遍存在长尾识别问题&#xff0c;朴素训练产生的模型在更高准确率方面偏向于普通类&#xff0c;导致稀有的类别准确率偏低。 key:解决LTR的关键是平衡各方面&a…

AutoMQ Kafka 云上十倍成本节约的奥秘(一): SPOT 实例

近年来&#xff0c;无论是海外还是国内&#xff0c;虽然受疫情影响&#xff0c;公有云的市场规模增速有所放缓&#xff0c;但是云的市场总规模仍然是持续增长的。公有云作为一个各个国家重点布局的战略方向和其本身万亿级市场的定位[1]&#xff0c;我们学习用好云是非常有必要的…

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目&#xff0c;git clone 之后使用 async 之后出现一下现象&#xff1a; 首先确定是我网络本身是没有问题的&#xff0c;尝试几次重新 async 之后还是出现问题&#xff0c;网上找了一些方法解决了本问题&#xff0c;以此来记录一下问题是如何解决的。 …

网络地址相关函数一网打尽

这块的函数又多又乱&#xff0c;今天写篇日志&#xff0c;以后慢慢补充 1. 网络地址介绍 1.1 ipv4 1.1.1 点、分十进制的ipv4 你对这个地址熟悉吗&#xff1f; 192.168.10.100&#xff0c;这可以当做一个字符串。被十进制数字、 “ . ”分开。IP地址的知识就不再多讲…

关于MyBatis和JVM的最常见的十道面试题

ORM项目中类属性名和数据库字段名不一致会导致什么问题&#xff1f;它的解决方案有哪些&#xff1f; 在ORM项目中&#xff0c;如果类的属性名称和数据库字段名不一致会场导致插入、修改时设置的这个不一致字段为null&#xff0c;查询的时候即使数据库有数据&#xff0c;但是查…

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出&#xff0c;滑到最下面&#xff0c;出现这个就说明构建成功了&#xff0c;如果没有出现&#xff0c;说明构建有问题&#xff0c;需要解决好问题才能启动哦~

Python 九九乘法表的7种实现方式

Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一&#xff0c;因此各种语言都有对应的实现方式&#xff0c;而 Python 也不例外。在 Python 中&#xff0c;我们可以使用多种方式来生成一个简单的九九乘法表。 实现方式一&#xff1a;双重循环 f…

使用 Node.js 和 Cheerio 爬取网站图片

写一个关于图片爬取的小案例 爬取效果 使用插件如下&#xff1a; {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…

Android T 远程动画显示流程(更新中)

序 本地动画和远程动画区别是什么? 本地动画&#xff1a;自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画&#xff1a;拿来吧你&#xff01;一个app A对另一个app B通过binder跨进程通信&#xff0c;控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…

F5负载均衡有何技术优势?为你详细解读

当今数字化时代&#xff0c;网络应用的性能对于企业的成功至关重要。负载均衡建立在现有网络结构之上&#xff0c;提供了有效的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。F5负载均衡技术则成为了许多企业实现高可用性和高…

原生table样式

HTML <div><table style"width: 100%;"><thead><tr><th style"width:25%;">董事会</th><th style"width:25%;">监事会</th><th style"width:25%;">股东</th><th sty…

物理信息神经网络PINN2024最新改良方案汇总(含复现代码)

传统的数值方法在处理复杂问题时可能需要大量的计算资源和时间&#xff0c;而改良后的PINN可以通过更有效的算法减少计算成本&#xff0c;使得求解过程更加高效。 在写论文时&#xff0c;我们也可以通过改进PINN减少数据需求、加速模型收敛、提高预测准确性、增强可解释性&…

linux -- 内存管理 -- SLAB分配器

SLAB分配器&#xff08;slab allocator&#xff09; SLAB分配器用于小内存空间管理&#xff0c;基本思想是&#xff1a;先利用页面分配器分配出单个或多个连续的物理页面&#xff0c;然后再此基础上将整块页面分割为多个相等的小内存单元&#xff0c;来满足小内存空间分配的需…