ArrayList与顺序表的简单理解

news2024/11/26 13:52:01

 前言----list

         在集合框架中,List是一个接口,继承自Collection。Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:

                

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

             

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

        要知道List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口,具体使用参考下文。

1.线性表

        线性表(linear list)是n个具有相同特性的数据元素的有限序列

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

2.顺序表

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

3. 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 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表(物理地址连续存储单元依次存储数据元素线性结构

3.1 ArrayList的构造

        1ArrayList()--->空参构造

 public static void main(String[] args) {
       ArrayList<Integer> arrayList = new ArrayList<>();
       arrayList.add(2023);
       arrayList.add(11);
       arrayList.add(28);
    }

        底层代码逻辑:

 

        2.2ArrayList(Collection<? extends E> c)-------->利用其他 Collection 构建 ArrayList

        <? extends E>------------------------------>
        该语句规定了ArrayList类的类型上界,即被用来存储到arraylist类中数组空间elementdata里的元素的类型上限是E,后面定义要被装载的元素类型必须是E本身或者E的子类。 

public static void main(String[] args) {
       ArrayList<Integer> list = new ArrayList<>();
       list.add(-1);
       list.add(100);
       list.add(200);
       ArrayList<Number> list12 = new ArrayList<>(list);
       list12.add(-100);
       System.out.println(list12);
    }

        代码执行结果如下图所示: 

 

        我们构造的list(1、实现了 collection接口,能够支持一些规范的容器操作;2、是支持小于等于interger类数据的存储),可以传递到list12里(1、list12实现了collection接口,2、它支持的数据类型<=number,已知interger< number)

        2.3ArrayList(int initialCapacity)----->指定顺序表初始容量

 public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>(2);
        arrayList.add(100);
        arrayList.add(200);
    }

源码分析: 

           

 all in all:

3.2 ArrayList常见操作

        一般来说常见的方法如下图所示:

        下面来对一些较为重要的方法通过源代码来进行分析:

        1.boolean add(E e) ------>尾插 e

       

        首先arraylist的底层设置,默认容量为10;

        当我们执行完成以上代码的第一句时,虽然我们有默认为10的存储空间,但是当前却没有给顺序表list分配;当执行完第二句(即第一句add语句)时,我们才会分配一个容量为10的空间给list;

        当我们一直执行add操作,为了确保一直有存储空间来存储数据,在每一次add语句执行添加元素之前,语句会提前检查剩余的容量是否足够,当容量不足以存储数据时,会提前对空间容量进行扩容,且扩容是在前一个容量的数量上乘以1.5(即1.5倍扩容)

        具体如下图展示:

        小结:
        1. 检测是否真正需要扩容之后,最后是通过调用 grow 进行扩容
        2. 预估需要库容的大小 初步预估按照1.5 倍大小扩容
(1、初步预估按照1.5倍大小扩容 ;2、如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容;3、 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败)
        3. 也可以使调用copyOf 方法进行扩容

        2. void add(int index, E element)

        在 list 的 index 位置插入指定元素, index 及后续的元素统一往后移动一个位置,下图为底层原码:

         3.List<E> subList(int fromIndex, int toIndex) ---->

        理解:使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData数组;Sub:截取产生的list,不是新产生的,而是直接将原来list相对应位置的地址传递到新的list当中。

 public static void main(String[] args) {
        ArrayList<Integer> arraylist = new ArrayList<>();
        arraylist.add(2023);
        arraylist.add(11);
        arraylist.add(28);
        List<Integer> sub = arraylist.subList(1, 3);
        System.out.println(sub);
        sub.set(0,100000);
        System.out.println(sub);
        System.out.println(arraylist);
    }

        运行结果展示: 

 

        该操作构成一个新的list返回,但是和arrayList共用一个数组,不会产生一个新的对象,所以在新list上进行修改数值时,由于指向的部分引用相同,会导致就list的数值也会发生变化。 如下下图分析所示:

 

3.3 ArrayList的遍历

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

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.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}

        关于迭代器:

4. ArrayList的优缺点

        由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景,下面是详细的总结:

缺点:

  1. 插入数据必须移动其他数据,最坏情况下,就是插入到0位置,时间复杂度O(N);
  2. 删除数据必须移动其他数据,最坏情况下,就是删除0位置,时间复杂度O(N)
  3. 扩容之后有可能浪费空间(扩容之后结果我们只使用一两个空间)。

优点:

  1. 在给定下标情况下进行查找的时候,时间复杂度O(1);

        注意:顺序表适合给定下标查找的情况。

ps:本次内容就到这里了,如果对你有帮助的话,还请一键三连哦!!!

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

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

相关文章

Redis队列stream,Redis多线程详解

Redis 目前最新版本为 Redis-6.2.6 &#xff0c;会以 CentOS7 下 Redis-6.2.4 版本进行讲解。 下载地址&#xff1a; https://redis.io/download 安装运行 Redis 很简单&#xff0c;在 Linux 下执行上面的 4 条命令即可 &#xff0c;同时前面的 课程已经有完整的视…

JAVA基础进阶(十三)

一、反射概述 反射是指对于任何一个Class类&#xff0c;在"运行的时候"都可以直接得到这个类的全部成分。 在运行时,可以直接得到这个类的构造器对象&#xff1a;Constructor 在运行时,可以直接得到这个类的成员变量对象&#xff1a;Field 在运行时,可以直接得到…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这一节主要是对每个流程节点的字段规则设置与操作规则设置&#xff0c;目前也是只针对自定义业务表单。 1、…

JS 绘制半径不一致的环形图进度条

HTML部分: <canvas id"mycanvas" width"100" height"100"></canvas>JS部分&#xff1a; const option {element: "mycanvas", // 元素count: 26, // 高亮数据totalCount: 129, // 总数据progressColor: #3266FB, // 进…

大模型的实践应用9-利用LoRA方法在单个GPU上微调FLAN-T5模型的过程讲解与实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型的实践应用9-利用LoRA方法在单个GPU上微调FLAN-T5模型的过程讲解与实现&#xff0c;文本我们将向您展示如何应用大型语言模型的低秩适应(LoRA)在单个GPU上微调FLAN-T5 XXL(110 亿个参数)模型。我们将利用Tran…

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时&#xff0c;可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容&#xff0c;避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…

源码剖析 Spring Security 的实现原理

Spring Security 是一个轻量级的安全框架&#xff0c;可以和 Spring 项目很好地集成&#xff0c;提供了丰富的身份认证和授权相关的功能&#xff0c;而且还能防止一些常见的网络攻击。我在工作中有很多项目都使用了 Spring Security 框架&#xff0c;但基本上都是浅尝辄止&…

443. 压缩字符串

这篇文章会收录到 : 算法通关村第十二关-黄金挑战字符串冲刺题-CSDN博客 压缩字符串 描述 : 给你一个字符数组 chars &#xff0c;请使用下述算法压缩&#xff1a; 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 &#xff1a; 如果这一组长度为 1 &#xff0c;…

华清远见嵌入式学习——C++——作业一

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" << endl;getline(cin,str);int dx0,xx0,sz0,kg0,qt0;int len str.size() 1;for(int i0;i<l…

【读论文】【泛读】S-NERF: NEURAL RADIANCE FIELDS FOR STREET VIEWS

文章目录 0. Abstract1. Introduction2. Related work3. Methods-NERF FOR STREET VIEWS3.1 CAMERA POSE PROCESSING3.2 REPRESENTATION OF STREET SCENES3.3 DEPTH SUPERVISION3.4 Loss function 4. EXPERIMENTS5. ConclusionReference 0. Abstract Problem introduction&…

小狐狸ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端最新去弹窗授权

ChatGPT付费创作系统V2.3.4版本优化了很多细节&#xff0c;如果使用着2.2.9版本建议没升级的必要。该版本为编译版无开源&#xff0c;2.3.X版本开始官方植入了更多的后门和更隐性的弹窗代码&#xff0c;后门及弹窗处理起来更麻烦。特别针对后台弹窗网址、暗链后门网址全部进行了…

UDS 相关时间参数

文章目录 UDS 全部时间参数UDS 应用层诊断时间参数1、P2 Client P2 Server P2* Client P2* Server 图例2、S3 Client S3 Server 图例 UDS CNA-TP网络层时间参数1、N_As/N_Ar 图例2、N_Bs 图例3、 N_Br 图例4、N_Cs 图例N_Cr 图例 UDS 网络层流控制时间参数 UDS 全部时间参数 UD…

vue3+ts 全局函数和变量的使用

<template><div>{{ $env }}<br />{{ $filters.format("的飞机") }}</div> </template><script setup lang"ts"> import { getCurrentInstance } from "vue"; const app getCurrentInstance(); console.log…

CVE-2020-11651(SaltStack认证绕过)漏洞复现

简介 SaltStack是使用Python开发的一个服务器基础架构集中化管理平台,底层采用动态的连接总线,使其可以用于编配,远程执行, 配置管理等等。 Salt非常容易设置和维护,而不用考虑项目的大小。从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的…

matlab频谱合成音乐《追光者》

选择你喜欢的一首钢琴曲&#xff0c;下载并分析曲谱&#xff0c;用matlab工具用频谱合成方法完成这首曲子的音乐合成。 前言&#xff1a;此文章为个人使用Matlab合成一首《追光者》音乐&#xff0c;且带混响和声效果 文章目录 一.题目二.要求三.课程设计目的四.概要设计五.详细…

Django项目部署本地windows IIS(详细版)和static文件设置(页面样式正常显示)

目录 必要条件&#xff1a; 一、下载并启用wfastcgi 二、window安装 IIS功能 三、IIS管理器中添加网站 1、复制项目 2、复制wfastcgi.py文件 3、创建文件web.config 4、添加网站&#xff0c;填写信息 5、启动fastcgi程序 6、修改进程标识 四、static文件设置和正确显…

吉利展厅 | 透明OLED拼接2x2:科技与艺术的完美融合

产品&#xff1a;4块55寸OLED透明拼接屏 项目地点&#xff1a;南宁 项目时间&#xff1a;2023年11月 应用场景&#xff1a;吉利展厅 在2023年11月的南宁&#xff0c;吉利展厅以其独特的展示设计吸引了众多参观者的目光。其中最引人注目的亮点是展厅中央一个由四块55寸OLED透…

pandas教程:USDA Food Database USDA食品数据库

文章目录 14.4 USDA Food Database&#xff08;美国农业部食品数据库&#xff09; 14.4 USDA Food Database&#xff08;美国农业部食品数据库&#xff09; 这个数据是关于食物营养成分的。存储格式是JSON&#xff0c;看起来像这样&#xff1a; {"id": 21441, &quo…

4、stable diffusion

github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…

快速筛出EXCEL行中的重复项

比如A列是一些恶意IP需要导入防火墙&#xff0c;但包括一些重复项&#xff0c;为不产生错误&#xff0c;需要把重复项筛出来&#xff1a; 1、给A列排序&#xff0c;让重复项的内容排在相邻的行 2、在B列中写一个条件函数&#xff1a;IF(A1A2,1,0)&#xff0c;然后下拉至行尾完成…