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

🍿顺序表

  • 🧀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,否则返回falseif(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.mzph.cn/news/656294.shtml

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

相关文章

app广告变现|如何提升app广告点击率?

提升app内的广告点击率&#xff08;CTR&#xff09;可以增加广告收入&#xff0c;而对广告主来说&#xff0c;广告点击率下降会直接影响广告主的投资回报率&#xff0c;因此&#xff0c;如何提升广告点击率&#xff0c;对app运营来说是一项重要的工作。 AdSet官网 | 聚合SDK广…

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…

C++ ffmpeg RTSP 视频推流实现, arm linux平台

环境&#xff1a; FFmpeg版本&#xff1a;n4.2.2 下载地址&#xff08;下载编译后请确认版本正确&#xff09;&#xff1a; https://ffmpeg.org//download.html 下面地址经过第三方git加速可能存在实效性&#xff1a; https://hub.fgit.cf/FFmpeg/FFmpeg/tree/n4.4.2实现代码…

深入解析Dubbo负载均衡策略

深入解析Dubbo负载均衡策略 I. 引言 在当今日益复杂和庞大的网络环境中&#xff0c;分布式系统的设计和实现成为了现代软件架构的重要组成部分。Dubbo框架作为一种高性能、轻量级的分布式服务框架&#xff0c;为构建分布式系统提供了强大的支持。然而&#xff0c;随着系统规模…

发票pdf文件解析

借助pdfplumber 解析 效果如下&#xff1a; { 发票号码(FPHM): 24322000000011529984, 开票日期(KPRQ): 2024年01月11日, 合计(HJ): 1205.94, 购方: 91320213586657279T, 销方: 91320214MAD1N7EN36, 价税合计(JSHJ): 1218.00, 项目(XM)-1: …

【HarmonyOS应用开发】UIAbility实践第一部分(五)

一、UIAbility概述 1、UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 2、每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 3、一个应用可以有一个UI…

获取文件夹下所有文件路径

有时候我们会获取文件夹下所有文件的路径以及完成的名称,这时候如果有一个函数库轻松帮我得到数据就好了,还真有. cpp void getFiles(const std::string & path, std::vector<std::string> & files) { //文件句柄 long hFile 0; //文件信息&#xff0c;_fi…

信息安全考证攻略

&#x1f525;在信息安全领域&#xff0c;拥有相关的证书不仅能提升自己的专业技能&#xff0c;更能为职业生涯增添不少光彩。下面为大家盘点了一些国内外实用的信息安全证书&#xff0c;让你一睹为快&#xff01; &#x1f31f;国内证书&#xff08;认证机构&#xff1a;中国信…

数据与资源可视化——长安链运维监控实践

前言 “链上的交易总量是多少”&#xff0c;“我的链上现在有多少区块了”&#xff0c;“节点是否存活无法第一时间感知到”&#xff0c;除sdk查询链上的相关信息外&#xff0c;今天我们介绍一种新的方式实现链上数据与相关资源的可视化的监控。 简介 监控链上数据以及链上节…

[提高工作开发效率,远离996]程序员常用的工具软件推荐

前言 现如今&#xff0c;技术发展十分迅猛&#xff0c;开发者只有通过不断的学习才能跟得上时代的步伐。而为了便于学习和工作&#xff08;减少996&#xff09;&#xff0c;涌现了很多优秀的开发工具用以帮助开发者提高工作效率。现在我把我工作多年来收集实用的开发利器分享出…

蓝桥杯-常用STL(一)

常用STL &#x1f388;1.动态数组&#x1f388;2.vector的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2构造一个动态数组&#x1f52d;2.3插入元素&#x1f52d;2.4获取长度并且访问元素&#x1f52d;2.5修改元素&#x1f52d;2.6删除元素&#x1f52d;2.7清空 &#x1f38…

关于监控的那些事,你有必要了解一下

监控在整个运维和产品生命周期中扮演着至关重要的角色。其目标是在应用的各个阶段&#xff0c;从程序设计、开发、部署到下线&#xff0c;实现事前预警、事中问题定位和事后问题分析的全方位服务。 一、监控的目的 监控贯穿应用的整个生命周期&#xff0c;服务对象主要包括技…

上个厕所的时间了解链路追踪基本概念

大家好&#xff0c;我是蓝胖子&#xff0c;随着微服务的普及&#xff0c;在面对日益复杂的架构和请求链路时&#xff0c;链路追踪技术就显得更加重要&#xff0c;今天我们花5分钟的时间&#xff0c;来掌握和链路追踪相关的基本概念。不会涉及到具体的技术框架和落地&#xff0c…

07.领域驱动设计:3种常见微服务架构模型的对比和分析

目录 1、概述 2、整洁架构 3、六边形架构 4、三种微服务架构模型的对比和分析 5、从三种架构模型看中台和微服务设计 5.1 中台建设要聚焦领域模型 5.2 微服务要有合理的架构分层 5.2.1 项目级微服务 5.2.2 企业级中台微服务 5.3 应用和资源的解耦与适配 6、总结 1、概…

性能测试分类及常用指标

性能测试是个综合的概述&#xff0c;性能测试指的是测试一种分类或多种分类&#xff0c;任何一具体分类&#xff0c;都是性能测试 一、性能测试常用分类 负载测试压力测试并发测试稳定性测试 性能测试分类还有其他类型比如&#xff1a;配置测试、容量测试等&#xff0c;前期…

AttributeError: ‘Plotter‘ object has no attribute ‘topicture‘

在以下网址找到自己的pytorch和cuda版本然后点击进入&#xff1a; https://nvidia-kaolin.s3.us-east-2.amazonaws.com/index.html 下载自己系统和python对应的最新版本 使用pip安装 pip install kaolin-0.14.0-cp38-cp38-linux_x86_64.whl

记录学习--vue发各种请求参数的请求

①发get请求&#xff0c;请求参数是数组&#xff0c;后端用RequestParam List<String>接收 axios.get(/user, {params: {ID: 12345,things: myThings ,}}) // 在参数后面加上&#xff08; &#xff09;&#xff0c;即可把数组变成字符串 // 请求变成 .../user?ID1234…

数据可视化 pycharts实现地理数据可视化(全球地图)

自用版 紧急整理一点可能要用的可视化代码&#xff0c;略粗糙 以后有机会再改 requirements&#xff1a; python3.6及以上pycharts1.9 数据格式为&#xff1a; 运行结果为&#xff1a; import pandas as pd from pyecharts.charts import Map, Timeline from pyecharts im…

【C/C++ 06】基数排序

基数排序是桶排序的一种&#xff0c;算法思路为&#xff1a; 利用队列进行数据收发创建一个队列数组&#xff0c;数组大小为10&#xff0c;每个元素都是一个队列&#xff0c;存储取模为1~9的数从低位到高位进行数据收发&#xff0c;完成排序适用于数据位不高的情况&#xff08…

C# IP v4转地址·地名 高德

需求: IPv4地址转地址 如&#xff1a;输入14.197.150.014&#xff0c;输出河北省石家庄市 SDK: 目前使用SDK为高德地图WebAPI 高德地图开放平台https://lbs.amap.com/ 可个人开发者使用&#xff0c;不过有配额限制。 WebAPI 免费配额调整公告https://lbs.amap.com/news/…