当前位置:

首页 > 编程开发 > Java中ArrayList与顺序表怎么定义与实现

Java中ArrayList与顺序表怎么定义与实现

1、线性表定义线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linearlist)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。特征集合中必存在唯一的一个“第一元素”。集合中必存在唯一的一个“最后元素”。除最后一个元素之外,均有唯一的后继(后件)。除第一个元素之外,均有唯一的前驱(前件)。2、顺

本文目录

      1、线性表

      定义

      线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

      常见的线性表:顺序表、链表、栈、队列...

      线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

      特征

      • 集合中必存在唯一的一个“第一元素”。

      • 集合中必存在唯一的一个 “最后元素” 。

      • 除最后一个元素之外,均有唯一的后继(后件)。

      • 除第一个元素之外,均有唯一的前驱(前件)。

      2、顺序表

      定义

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

      实现

      首先我们需要创建一个数组来存放数据。

      Java中ArrayList与顺序表怎么定义与实现

      备注:因为我为了方便就先创建的整形数组,为了能更好的适应各种类型,大家可以创建泛型的数组,我这里就没写了。

      Java中ArrayList与顺序表怎么定义与实现

      接下来就是对顺序表的各种操作。例如:基本的CURD,打印顺序表,获取顺序表长度,清空顺序表等等。

      打印数组

      因为是数组,所以直接遍历数组打印就好了

      Java中ArrayList与顺序表怎么定义与实现

      新增元素

      增加元素的时候需要考虑到数组是否满状态的问题,所以我们需要判断,要死数组空间已满,我们还需要进行扩容。另外,我们还需要判断在这个pos位置是否合法。

      判断空间是否已满方法

      Java中ArrayList与顺序表怎么定义与实现

      这里我们简化代码为:

      Java中ArrayList与顺序表怎么定义与实现

      如果要扩容的话,在扩容完成之后,因为顺序表是连续的结构,所以在pos位置新增元素的话,那么pos位置之后的元素就要依次往后挪。这样才能把元素新增进去。

      Java中ArrayList与顺序表怎么定义与实现

       注意:在扩容之后我们需要更改CAPACITY和usedSize的大小。

      判断是否包含某个元素

      在这我们需要考虑到此时数组是否为空的情况。

      Java中ArrayList与顺序表怎么定义与实现

      之后还是直接遍历数组的操作。

      Java中ArrayList与顺序表怎么定义与实现

      查找元素

      在这里也需要一次判空操作。

      Java中ArrayList与顺序表怎么定义与实现

      获取pos位置的元素

      这里可能会出现数组为空的情况和pos不合法的情况,所以需要判断。

      我这里是手动抛出的异常,没有另外写了。

      Java中ArrayList与顺序表怎么定义与实现

      更改pos位置的值

      Java中ArrayList与顺序表怎么定义与实现

      删除操作

      删除某个位置上的元素,这里是直接从这个元素开始,让其后面的元素覆盖掉他前一个元素,以达到删除的目的。

      Java中ArrayList与顺序表怎么定义与实现

      获取顺序表长度

      Java中ArrayList与顺序表怎么定义与实现

      清空顺序表

      Java中ArrayList与顺序表怎么定义与实现

      后面这几个操作比较简单就不多叙述了。

      3、ArrayList

      简介:

      在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

      Java中ArrayList与顺序表怎么定义与实现

      [说明]

      1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。

      2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。

      3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

      4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。

      5.  ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。

      使用

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

       一些常见方法

      方法解释
      boolean add(E e)尾插e
      void add(int index, E element)将 e 插入到 index 位置
      boolean addAll(Collection 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< E > subList(int fromIndex, int toIndex)截取部分 list

       ArrayList的遍历

      循环遍历

      Java中ArrayList与顺序表怎么定义与实现

      foreach遍历

      Java中ArrayList与顺序表怎么定义与实现

      迭代器

              System.out.println("======迭代器1=========");
       
              ElementObservableListDecorator list;
              Iterator it =  list.iterator();
              while (it.hasNext()) {
                  System.out.println(it.next());
              }
              System.out.println("======迭代器2=========");
              ListIterator it2 =  list.listIterator();
              while (it2.hasNext()) {
                  System.out.println(it2.next());
              }

      顺序表和数组的区别:

      上面说,顺序表的底层可以理解为一个数组,但是相比于数组,更加的高级。

      顺序表可以自己扩容;

      顺序表严格区分数组容量和元素的个数。

      所以数组其实就是一种不完备的顺序表。

      顺序表中的注意点:

      • 我们需要区分顺序表中的两个概念:容量(capacity)和元素个数(size)。

      • 容量可以理解为数组的大小(长度),元素个数是size中记录的有效元素个数。

      • 顺序表中,数据的存储是需要连续的,不可以元素和元素之间存在“空隙”,当进行插入、删除等操作时,操作完成后,也要保证顺序表的连续。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

      为什么要购买正版软件?
      01 官方授权

      授权来源透明,订单与许可信息可随时查询。

      02 即时交付

      付款成功后自动发放激活信息,支持订单追踪。

      03 中文协助

      安装、激活、迁移与续费问题都有专人响应。

      04 长期可用

      提供升级提醒与授权管理,换机时也能轻松迁移。

      网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

      Copyright ©2018-2026