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

🍿顺序表

  • 🧀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!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Focaler-IoU:更聚焦的IoU损失

摘要 边界框回归在目标检测领域中起着至关重要的作用&#xff0c;而目标检测的定位精度在很大程度上取决于边界框回归的损失函数。现有的研究通过利用边界框之间的几何关系来提高回归性能&#xff0c;而忽略了难易样本分布对边界框回归的影响。本文分析了难易样本分布对回归结…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数&#xff08;如add()&#xff09;&#xff0c;在编译阶段不会报错&#xff0c;在链接阶段会报错呢&#xff1f; 答&#xff1a;先说几个代码编译的结论&#xff1a; 单个\.c源文件文件被编译成机器码文件时&#xff0c…

DC-Windows备份(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 题目配置步骤在DC1上备份系统状态到D:\共享文件夹所有用户具有读/写权限验证查看DC1备份成功的截图在InsideCli上查看备份文件(查看文件夹安全属性)题目 在DC1上备份系统状态到D:\,…

Linux实验记录:使用firewalld

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

Qt之QLabel介绍

概述 QLabel是QT界面中的标签类&#xff0c;它从QFrame下继承&#xff0c;QLabel 类代表标签&#xff0c;它是一个用于显示文本或图像的窗口部件。我们主要介绍一下QLabel的一些简单的使用。 设置颜色背景色和字体的颜色大小 字体及颜色 设置文字使用的是setText函数。 QStri…

一文彻底搞懂redis数据结构及应用

文章目录 1. Redis介绍2.五种基本类型2.1 String字符串2.2 List列表2.3 Set集合2.4 Zset有序集合2.5 Hash散列 3. 三种基本类型3.1 Bitmap &#xff08;位存储&#xff09;3.2 HyperLogLogs&#xff08;基数统计&#xff09;3.3 geospatial (地理位置) 4. Stream详解4.1 Stream…

小土堆pytorch学习笔记002

目录 1、TensorBoard的使用 &#xff08;1&#xff09;显示坐标&#xff1a; &#xff08;2&#xff09;显示图片&#xff1a; 2、Transform的使用 3、常见的Transforms &#xff08;1&#xff09;#ToTensor() &#xff08;2&#xff09;# Normalize() &#xff08;3&…

Java基础—面向对象—19static关键字详解、抽象类、接口、N种内部类

1、static关键字 匿名代码块、静态代码块、构造方法 静态代码块是在类加载的时候执行&#xff0c;仅执行一次 匿名代码块在调用构造函数之前 验证如下图&#xff1a; 2、静态导入包&#xff08;可能很多人听都没听过&#xff09; 3、Math是用final关键字的&#xff0c;fina…

Mybatis-Plus扩展

7 MybatisX插件[扩展] 7.1 MybatisX插件介绍 MybatisX 是一款基于 IDEA 的快速开发插件&#xff0c;为效率而生。 安装方法&#xff1a;打开 IDEA&#xff0c;进入 File -> Settings -> Plugins -> Browse Repositories&#xff0c;输入 mybatisx 搜索并安装。 功…

【Midjourney】如何自定义一套参数

使用Midjourney有时候会遇到需要调整某些参数的时候&#xff0c;例如宽高之类的&#xff1a; --hd --ar 7:4 而Midjourney中提供了一条指令用于自定义一套参数方便重复使用。 以下指令创建一个名为“mine”的选项&#xff0c;翻译过来就是 --hd --ar 7:4: 创建成功后会有类似…

112. 路径总和详解!!三种解法,总有一款适合你(Java)

513.找树左下角的值 题目链接&#xff1a;513. 找树左下角的值 BFS&#xff08;迭代&#xff09;法&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNod…

在Meteor Lake上测试基于Stable Diffusion的AI应用

上个月刚刚推出的英特尔新一代Meteor Lake CPU&#xff0c;预示着AI PC的新时代到来。AI PC可以不依赖服务器直接在PC端处理AI推理工作负载&#xff0c;例如生成图像或转录音频。这些芯片的正式名称为Intel Core Ultra处理器&#xff0c;是首款配备专门用于处理人工智能任务的 …

外包干了8个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Java 的 Map 與 List

通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的Map List 有序的数据放到Map&#xff0c;就变成无序。 List排序 按照code 的字母进行排序A-Z resTask.getListData().sort(Comparator.comparing(Gmer::getCode));…

深度强化学习(王树森)笔记08

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

【论文阅读|半监督小苹果检测方法S3AD】

论文题目 &#xff1a; : Semi-supervised Small Apple Detection in Orchard Environments 项目链接&#xff1a;https://www.inf.uni-hamburg.de/en/inst/ab/cv/people/wilms/mad.html 摘要&#xff08;Abstract&#xff09; 农作物检测是自动估产或水果采摘等精准农业应用不…

盘点热门的GPTS智能体,生产力远超原生ChatGPT4

OPENAI开放了GPTS智能体商店&#xff0c;类似于appstore的应用商店&#xff0c;在GPTS商店里面你可以发现并创建自定义版本的ChatGPT&#xff0c;这些版本结合了指令、额外知识和任何技能组合&#xff01; 本周精选 GPTS智能体不仅可以通过API的方式将你的私有化的数据和能力…

双链表的基本知识以及增删查改的实现

满怀热忱&#xff0c;前往梦的彼岸 前言 之前我们对单链表进行了非常细致的剖析&#xff0c;现在我们所面临的则是与之相对应的双链表&#xff0c;我会先告诉诸位它的基本知识&#xff0c;再接着把它的增删查改讲一下&#xff0c;ok&#xff0c;正文开始。 一.链表的种类 我…

机器学习和深度学习中的normalization(归一化)

在机器学习和深度学习中&#xff0c;normalization&#xff08;归一化&#xff09;是一种重要的数据预处理步骤&#xff0c;它的目的是改变数值数据的形式&#xff0c;以使其在一个固定的范围内&#xff0c;通常是 0 到 1&#xff0c;或者使其均值为 0&#xff0c;标准差为 1。…

Jenkins+Python自动化测试持续集成详细教程

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…