数据结构系列三:List+顺序表+ArrayList

数据结构系列三

  • 一、List
    • (1)什么是`List`
    • (2)常见接口介绍
    • (3)List的使用
  • 二、顺序表与ArrayList
    • (1)线性表
    • (2)顺序表
    • (3)顺序表常用方法的模拟实现
      • 1.一些定义
      • 2.`add(int data)`新增元素,默认在数组最后新增
      • 3.`add(int pos,int data)`在pos位置插入元素
      • 4.`contains`判断是否包含某个元素
      • 5.`indexOf`查找某个元素对应的位置
      • 6.`get`获取pos位置的元素
      • 7.`set`给pos位置的元素设置为value
      • 8.删除第一次出现的关键字key
      • 9.获取顺序表长度
      • 10.清空顺序表
    • (4)ArrayList简介
    • (5)ArrayList的构造
    • (6)ArrayList的遍历
    • (7)ArrayList的扩容机制
    • (8)ArrayList的问题及思考


一、List

(1)什么是List

在集合框架中,List是一个接口,继承自Collection
Collection也是一个接口,该接口中规范了后续容器中常用的一些方法,具体如下所示
在这里插入图片描述

  • Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:

在这里插入图片描述

  • 站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作

(2)常见接口介绍

List中提供了好的方法,具体如下
在这里插入图片描述

(3)List的使用

注意:List是个接口,并不能直接用来实例化
如果要使用,必须去实例化List的实现类,在集合框架中,ArrayListLinkedList都实现了List接口

public class demo1 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();List<String> list = new ArrayList<>();//推荐写法}
}

那么,如何使用呢?请大家跟着我的思路往下理解

二、顺序表与ArrayList

(1)线性表

若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每一个元素都有一个前驱和一个后继,这就叫线性表

线性表,是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列
线性表在逻辑上是线性结构,也就说是一条直线,但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数据和链式结构的形式存储

(2)顺序表

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

(3)顺序表常用方法的模拟实现

1.一些定义

import java.util.Arrays;class MyArray{public int usedSize;public int[] elem;public static final int DEFAULT_SIZE = 2;public MyArray(){this.elem = new int[DEFAULT_SIZE];}public MyArray(int initCapacity){this.elem = new int[initCapacity];}

2.add(int data)新增元素,默认在数组最后新增

思路:首先判断当前数组存没存放满,如果存放满了,则需要扩容,没存放慢,即可直接存入

        public boolean isFull(){if(this.usedSize == this.elem.length){return true;}return false;}public void add(int data){if(isFull()){this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}this.elem[this.usedSize] = data;usedSize++;}

3.add(int pos,int data)在pos位置插入元素

思路:首先判断当前pos位置的合法性,再判断数组存没存满,最后在pos位置存入数组

 public void add(int pos,int data){if(pos < 0 || pos > this.usedSize){throw new  PosOutOfBoundsException(pos + "位置不合法");}if(isFull()){this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}for (int i = usedSize - 1; i >= pos ; i--) {this.elem[i+1] = this.elem[i];}this.elem[pos] = data;this.usedSize++;}

4.contains判断是否包含某个元素

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

5.indexOf查找某个元素对应的位置

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

6.get获取pos位置的元素

思路:首先判断合法性,然后在返回对应的值

public int get(int pos){if(pos < 0 || pos >= this.usedSize){throw new PosOutOfBoundsException(pos + "位置不合法!");}return this.elem[pos];}

7.set给pos位置的元素设置为value

public void set(int pos,int value) {if (pos < 0 || pos >= this.usedSize) {throw new PosOutOfBoundsException(pos + "位置不合法!");}this.elem[pos] = value;}

8.删除第一次出现的关键字key

思路:先检查是否存在要删除的元素,然后在定位被删除元素位置,把后面的值依次覆盖

public void remove(int data){int index = indexOf(data);if(index == -1){System.out.println("没有这个数据");return;}for (int i = index; i < this.usedSize; i++) {this.elem[i] = this.elem[i+1];}this.usedSize--;}

9.获取顺序表长度

直接返回usedSize即可

public int size(){return usedSize;}

10.清空顺序表

public void clear(){this.usedSize = 0;//如果是引用类型/*for (int i = 0; i < this.usedSize; i++) {this.elem[i] = null;}this.elem[usedSize-1] = null;*/}

(4)ArrayList简介

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

在这里插入图片描述

【说明】

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

(5)ArrayList的构造

方法:

  1. ArrayList():无参构造
  2. ArrayList(Collection<? extends E> c):利用其他Collection构建ArrayList
  3. ArrayList(int initialCapacity):制定顺序表初始容量
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class demo1 {public static void main(String[] args) {//构造一个空的列表List<Integer> list = new ArrayList<>();//构造一个具有十个容量的列表List<Integer> list1 = new ArrayList<>(10);list1.add(1);list1.add(2);list1.add(3);//list.add("hello")//编译失败因为list1已经限定只能存储整型元素//list2构造好之后,于list1中元素一致ArrayList<Integer> list2 = new ArrayList<>(list1);//避免省略类型,否则任意类型的元素都可以放,使用时是一场灾难List list3 = new ArrayList();list3.add("1111");list3.add(123);}
}

ArrayList提供的方法比较多,大家使用的时候可以查看ArrayList的帮助文档
一般情况下,能够直接通过sout输出引用指向对象当中的内容的时候,此时一定重写了toString方法

(6)ArrayList的遍历

ArrayList可以使用三种方式遍历

import java.util.List;public class demo3 {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();//使用foreach遍历for(Integer integer: list){System.out.print(integer + " ");}System.out.println();//使用迭代器Iterator<Integer> it = list.iterator();while (it.hasNext()){System.out.print(it.next() + " ");}}
}
//运行结果
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
Process finished with exit code 0

注意:

  1. ArrayList最常使用的遍历方式是for+下标以及foreach
  2. 迭代器是设计模式的一种,后续容器接触多了在给大家介绍

(7)ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容

  1. 首先检测是否真正需要扩容,如果是,调用grow准备扩容
  2. 预估扩容的大小,初步预估按照1.5倍大小扩容,如果用户所需大小超过1.5倍大小,则按照用户所需大小扩容,真正扩容之前检测能否扩容成功,防止太大导致扩容失败
  3. 使用copyOf进行扩容

(8)ArrayList的问题及思考

  • 优点:可以通过下标进行随机访问
  • 缺点:
  1. 添加元素效率比较低
  2. 往O下标插入元素,须移动后面所有的元素,那么时间复杂度就变高了
  3. 删除的效率低,假设删除0下标的元素,也要移动后面的元素
  4. 扩容的时候,假设长度为100,扩容新增一个元素第101个,要1.5倍扩容,扩容50个只放进去一个,存在浪费空间的情况

顺序表适合静态的数据进行查找和更新,不适合用来插入和删除数据,那么我们就要依赖链表来做

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

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

相关文章

全局变量,局部变量

在main函数中又定义一遍全局变量&#xff1a;会导致程序出错 因为在函数中调用这个全局变量时&#xff0c;调用的值是在头文件下面的初始值&#xff0c;虽然你在main函数中改变了变量的值&#xff0c;但是你在main函数中重新定义了 如果这样写会过50%的数据&#xff0c;因为在…

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图&#xff08;但并不规范&#xff09; 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB&#xff1a;勾选此选项代表此贴图存储于Gamma空间中…

互联网搜索、联网搜索 API 的探索与公开接口、大模型联网搜索接口、全网搜索接口

互联网搜索、联网搜索 API 的探索与公开接口、大模型联网搜索接口、全网搜索接口 关键词&#xff1a;互联网搜索、API 接口、实时数据、大模型联网、智能问答、数据采集、技术实践、成本优势、市场对比 概述 在当前大模型及人工智能技术迅速发展的背景下&#xff0c;如何让离…

牛客练习赛134 —— B题 python 补题 + 题解

牛客练习赛134 B 题目描述 示例输入&#xff1a; 1 5 1 2 4 5 6 2 5 4 6 9示例输出&#xff1a; 32解题思路&#xff1a; 题目大意 给定一个2行n列的矩阵&#xff0c;允许交换两列一次&#xff0c;从左上角(1,1)走到右下角(2,n)&#xff0c;每一步只能向右或向下移动&#x…

电脑开机一段时间就断网,只有重启才能恢复网络(就算插网线都不行),本篇文章直接解决,不要再看别人的垃圾方法啦

下面的是我解决问题的心路历程&#xff0c;不想看的可以直接跳到解决方法上面&#xff01; 内心思路&#xff1a; w11电脑更新过系统后&#xff0c;我的电脑是常年不关机的&#xff0c;但是一天突然断网&#xff0c;试了很多方法都连不上&#xff0c;重启电脑就会好&#xff0…

Ubuntu部署ktransformers

准备工作 一台服务器 CPU&#xff1a;500G GPU&#xff1a;48G&#xff08;NVIDIA4090&#xff09; 系统&#xff1a;Ubuntu20.04&#xff08;github的文档好像用的是22.04&#xff09; 第一步&#xff1a;下载权重文件 1.下载hfd wget https://hf-mirror.com/hfd/hfd.s…

【Elasticsearch】同一台服务器部署集群

【Elasticsearch】同一台服务器部署集群 1. 同一台服务器搭建ES集群2. 配置不同的node节点3. ES集群中安装IK分词器4. 启动es集群5. Kibana访问集群6. es-head7. 集群中创建索引7.1 什么是分片以及分片的好处7.2 副本&#xff08;Replication&#xff09;7.3 通过es-head创建索…

1-1 VS Code+Keil5+STM32CubeMX开发环境搭建

1.0 卸载相关程序 使用这个方式安装工具&#xff0c;先将原先下载安装的软件去掉&#xff0c;然后再安装新的软件&#xff0c;这个卸载过程需要将原来的工具干净的卸载掉&#xff0c;使用专门的卸载工具&#xff0c;将注册表等文件也全部删除掉。 对于STM32CubeMX还要删除&…

C# 从基础神经元到实现在0~9数字识别

训练图片:mnist160 测试结果:1000次训练学习率为0.1时,准确率在60%以上 学习的图片越多&#xff0c;训练的时候越长(比如把 epochs*10 10000或更高时)效果越好 using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windo…

【算法与数据结构】单调队列

目录 单调队列 使用单调队列维护滑动窗口 具体过程&#xff1a; 代码实现&#xff1a; 复杂度分析&#xff1a; 使用单调队列优化动态规划 例题 单调队列 单调队列(deque)是一种特殊的队列&#xff0c;队列中的元素始终按严格递增或者递减排列。这样就可以保证队头元素…

矩阵的扩展运算(MATLAB和pytorch实例)

秩&#xff08;Rank&#xff09;的定义 秩的计算 初等行变换法&#xff08;最常用&#xff09;行列式法&#xff08;仅适用于方阵&#xff09; 满秩的分类方阵的满秩非方阵的满秩几何意义应用场景判断方法 矩阵的特征值 定义求解特征值 特征方程步骤 关键性质 迹与行列式相似矩…

python面试题整理

Python 如何处理异常&#xff1f; Python中&#xff0c;使用try 和 except 关键字来捕获和处理异常 try 块中放置可能会引发异常的代码&#xff0c;然后在except块中处理这些异常。 能补充一下finally的作用吗&#xff1f; finally 块中的代码无论是否发生异常都会执行&#xf…

linux之perf(17)PMU事件采集脚本

Linux之perf(17)PMU事件采集脚本 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Perf性能分析_Once_day的博…

Java数据结构-排序

目录 一.本文关注焦点 二.七大排序分析及相关实现 1.冒泡排序 2.简单选择排序 3.直接插入排序 4.希尔排序 5.堆排序 ​编辑 6.归并排序 7.快速排序 一.本文关注焦点 各种排序的代码实现及各自的时间空间复杂度分析及稳定性。 时间复杂度&#xff1a;在比较排序中主…

改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)

2 灰狼优化算法 2.1 基本灰狼优化算法 灰狼优化算法是一种模拟灰狼捕猎自然群体行为的社会启发式优化算法&#xff0c;属于一种新型的群体智能优化算法。灰狼优化算法具有高度的灵活性&#xff0c;是当前较为流行的优化算法之一。灰狼优化算法主要分为三个阶段&#xff1a;追…

创建Linux虚拟环境并远程连接

目录 下载VMware软件 下载CentOS 创建虚拟环境 远程连接Linux系统 下载VMware软件 不会的可以参考 传送门 下载CentOS 不会的可以参考 传送门 创建虚拟环境 打开VMware软件&#xff0c;创建虚拟机 选择典型安装 找到我们安装好的centOS文件&#xff0c;之后会自动检…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

《Head First设计模式》读书笔记 —— 命令模式

文章目录 本节用例餐厅类比点餐流程角色与职责从餐厅到命令模式 命令模式第一个命令对象实现命令接口实现一个命令 使用命令对象NoCommand与空对象 定义命令模式支持撤销功能使用状态实现撤销多层次撤销 One One One …… more things宏命令使用宏命令 队列请求日志请求 总结 《…

基于YOLO11深度学习的运动鞋品牌检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

DAY08 List接口、Collections接口、Set接口

学习目标 能够说出List集合特点1.有序2.允许存储重复的元素3.有带索引的方法(练习 add,remove,set,get) 能够使用集合工具类Collections类:static void sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。static <T> void sort(List<T> lis…