【List,ArrayList与顺序表】

目录

1,什么是List

2,List的使用

3,线性表

4,顺序表

4.1 接口的实现

5, ArrayList简介

6,ArrayList的使用

6.1 ArrayList的构造方法

6.2 ArrayList的常见操作

 6.3 ArrayList的遍历

7,ArrayList的具体使用

7.1 简单的洗牌算法

7.2 杨辉三角

7.3 面试题

8,ArrayList的优缺点


1,什么是List

在集合框架中,List是一个接口,继承自Collection。

Collection也是一个接口,继承自Iterable。

 

他的一些方法:

Iterable是最顶层的一个接口

 

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

List中提供了好的方法,具体如下:(部分)

2,List的使用

注意:List是个接口,并不能直接用来实例化。

如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。

3,线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...

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

4,顺序表

顺序表其实就是一个数组,数组本身是一块连续的内存

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

4.1 接口的实现

对数组进行增删改查:

定义一个IList接口:

定义MyArrayList类实现IList接口:

定义一个测试类Test:

接下来就对其接口里面的功能在重写方法里面一一完成:

1,新增元素,默认在数组最后新增

确定新增位置,只需要放到usedSize位置,usedSize+1即可。但是数据结构是一门非常严谨的学科,在这里我们还要判断数组是否已满!!!即在接口里面定义一个方法判断数组是否已满!

重写这个方法,若usedSize等于数组长度,则满

2,在pos位置新增元素

重最后一个数据往后面挪,才能插入指定位置,所以定义一个下标i,i的起始位置是usedSize-1的位置,把i位置的值赋值给i+1,在i--,i<pos结束,i>=pos都要移动,再将需要插入的元素存入pos位置,usedSize++即可!!!但是要考虑pos位置是否合法,不能<0,且不能跳起存放,数据结构规定当你在插入一个数据或删除一个数据是,当前数据前面一定要有唯一的前驱(连续存放),即不能pos>usedSize,若满了扩容。

在MyArrayList类中写一个方法判断pos合不合法:

若不合法,可抛出一个异常,则定义一个异常类:

最终代码:

3,判定是否包含某个元素(给一个数,查找数组中是否包含这个数)

查找次数不用把整个数组查找完,只需要查找usedSize次即可

4,查找某个元素对应的位置

5,获取pos位置的元素

在这种情况下,pos不能等于usedSize,pos合法的位置只要0~usedSize-1,其他都不合法!

即写一个方法来判断pos位置元素是否合法:

6,给pos位置的元素设为value—>相当于更新

首先检查pos位置的合法性,不能pos<0,不能pos>=usedSize,即可直接调用checkPosofGet方法,可将此方法名修改一下,以便观察与理解

7,删除第一次出现的关键字key 

可定义一个下标i,代表你要删的位置,让i+1的值赋值给i下标的值,然后i++,再让i+1的值赋值给前面的值,走到i<usedSize-1的位置即可,最后在usedSize--。要判断你要删除的关键字是否在这个数组里面

8,获取顺序表的长度

9,清空顺序表

这个数组是一个基本数据类型,如果要清空它,直接将usedSize置为0即可,因为在我们插入的时候,是按照usedSize位置放的

但是如果数组当中的元素是引用类型该怎么办?

这个数组里面的元素不是基本数据类型,它是一个一个的对象,即数组里面存的是对象的地址,如果说只是将usedSize置为0,引用类型势必会引用一个对象,但是里面的元素还在引用着之前的对象,导致不需要的对象还在引用它,这叫做内存泄漏。正确的做法是遍历数组,把每个元素置为null,再把usedSize置为0。

10,打印顺序表

至此,这就是我们自己实现的一个顺序表  使用于经常进行下标查找或更新的操作

ArrayList自己也有以上方法

5, ArrayList简介

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

这里发生向上转型,动态绑定,ArratList重写了List的add方法,即list调用ArrayList的add方法

6,ArrayList的使用

6.1 ArrayList的构造方法

1,不带参数的构造方法

 我们说顺序表的背后就是一个数组,那么可进入到elementDate的源码

此时这个数组还没有初始化,默认为空,只是一个数组引用,但发现这个不带参数的构造方法里面,elementDate等于DEFAUL...  进入他的源码

发现这个数组也没有分配内存,长度为0,也就是说调用不带参数的构造方法,并没有给数组分配大小,那么数组没有分配大小,为什么还能add呢

进入到add的源码

发现里面还有一个add方法,在进入此时add的源码

发现当我们add(10)的时候,if语句成立elementDate等于了grow方法,grow方法是一个扩容方法啊,进入grow方法的源码

继续进入这个grow方法

查看黄色框框的源码

当if语句不成立时,会给elementDate分配一个内存,在1和10取最大值。

也就意味着,当调用不带参数的构造方法进行add的时候,第一次add会分配大小为10的内存

当if条件成立时,会进行1.5倍扩容

2,带参数的构造方法

进入带参数的构造方法里面,通过if语句判断,6大于0成立,就会给这个数组elementDate分配一个长度为6的数组。如果给的是0,elementDate这个数组就会等于EMPTY_...,我们进入到EMPTY_...的源码         在else给一个小于0的数,就会抛一个异常

发现他也是一个空的数组

相当于这个带参数的构造方法是在初始化数组指定大小

3,比较奇怪的构造方法

Collection是顶层的一个接口,可实例化ArrayList,只要实现了该接口都可以进行传递,?代表通配符,E代表通配符的上界,相当于尖括号里面的类型要么是E,要么是E的子类

例如:

就是说arrayList这个引用他的类型相当于是ArrayList<Integer>,然后ArrayList这个类型也实现了Collection这个接口,<Integer>1是<Integer>2的本身或子类,所以arrayList就可以传递

6.2 ArrayList的常见操作

addAll()

remove()

我们在删除的时候,可以传一个数组下标,也可以传一个对象

如果要删一个对象

subList()

源码:

当我们对list进行一更新

在打印arrayList

当add完以后,list截取了arrayList的[ 1,3 )下标的元素,这个截取并不是生成了一个新的list,而是让list直接引用了1下标元素的地址,根本没有重新生成一个新的对象,即修改list下标的元素,也会影响arrayList所对应下标的元素。

 6.3 ArrayList的遍历

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

for循环:

for each

迭代器:

iterator源码:

是一个接口

所以的打印都借助 it 引用进行打印

判断 it 是否有下一个,有进来,打印下一个元素,打印的同时 it.next()也会向后走一步

还可以这样:

Iterator不可进行传参,默认重0下标开始遍历

查看listIterator的源码

也并不独特,是继承于Iterator

还可以倒着遍历                 

7,ArrayList的具体使用

7.1 简单的洗牌算法

1,生成52张牌(没有大小王)

定一个类,用来完整的表示一张牌,在定义成员变量(牌由数组和花色组成)

在定义一个类,用来表示所生成的52张牌

2,洗牌

在Cards类里面写一个方法,进行洗牌:

洗牌逻辑:下标与下标之间进行交换,定义下标 i 从最后一个51开始,生成[ 0,i )的随机数,与 i 下标的元素进行交换,换完之后 i-- ,再把 i 传给随机数的生成,继续交换

3,三个人轮流接五张牌

问题一:给个人抓的牌放到哪里?

给每个人申请一个list,只要抓到一张牌就往list里面放

问题二:三个人轮流抓5次牌?

给两个for循环

问题三:怎么抓牌?

所有的牌都在cardList里面,每次抓的牌都是第一张,只需要remove第一张牌即可

问题四:抓到牌你怎么知道放到哪个人的list里面

代码:

4,测试类

生成的牌:

洗的牌:

抓牌及剩余的牌:

还可以自己增加点功能:

比如对拿到的牌进行排序,可通过Collections,这个Collections是来操作集合的工具类,里面有个sort方法,可进行对list进行排序

7.2 杨辉三角

每一行的一个是1,每一行的最后一个也是1

代码:

7.3 面试题

st1:welcome to bit

st2:come

要求:删除第一个字符串当中所有的第二个字符串当中的字符。

例如该例中返回结果:wl t bit

方法一:顺序表

只需要遍历st1,拿到某个字符,判断这个字符是否存在st2当中?

若不存在,放到List当中即可

代码:

方法二:StringBuilder

判断之后使用啊append进行拼接即可

8,ArrayList的优缺点

优点:适合根据下标进行查找和更新的场景

缺点:

1. ArrayList底层使用连续的空间,任意位置插入或删除元素时,要移动元素,最坏情况下,0下标插入或删除时,要移动所以元素,故时间复杂度为O(N)。

2.扩容空间可能会浪费,假设现在100个长度放满了,还有一个元素没放,此时需要1.5倍扩容,多了50个,但实际只存放了一个元素。

3. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗

为了弥补这些缺点,就有了链表!!!

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

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

相关文章

【数据分享】中国高技术产业统计年鉴(2023年)

大家好&#xff01;今天我要向大家介绍一份重要的高技术产业发展情况统计数据资源——《中国高技术产业统计年鉴》。这份年鉴涵盖了从2023年中国高技术产业发展情况的全面数据&#xff0c;并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 …

混凝土结构中最小配筋率45ft/fy怎么来的?

文章目录 0. 背景1. 原理解析2. 总结 0. 背景 上学的时候就对混凝土结构规范中关于最小配筋率“ 45 f t / f y 45f_t/f_y 45ft​/fy​”的表述很好奇&#xff0c;今天终于看到解释了。原文来自这里&#xff0c;喜欢的可以关注原作者。 按照原作者的说法&#xff0c;本文的解释…

基于SpringBoot3+Vue3+原生小程序的设计与实现

大家好&#xff0c;我是程序员小孟。 最近开发了一个宠物的小程序&#xff0c;含有详细的文档、源码、项目非常的不错&#xff01; 一&#xff0c;系统的技术栈 二&#xff0c;项目的部署教程 前端部署包&#xff1a;npm i 启动程序&#xff1a;npm run dev 注意事项&…

Python中的@staticmethod和@classmethod装饰器

名词解释 本文主要介绍静态方法staticmethod和类方法classmethod在类中的应用&#xff0c;在介绍这两个函数装饰器之前&#xff0c;先介绍类中的几个名词&#xff0c;便于后面的理解&#xff1a; 类对象&#xff1a;定义的类就是类对象 类属性&#xff1a;定义在__init__ 外…

UML交互图-序列图

概述 序列图又称为时序图、活动序列图&#xff0c;它是一种详细表示对象之间及对象与参与者实例之间交互的图,它由一组协作的对象(或参与者实例)及它们之间可发送的消息组成&#xff0c;它强调消息之间的时间顺序。 序列图主要用于按照交互发生的一系列顺序&#xff0c;显示对…

【C语言】03.分支结构

本文用以介绍分支结构&#xff0c;主要的实现方式为if语句和switch语句。 一、if语句 1.1 if语句 if (表达式)语句表达式为真则执行语句&#xff0c;为假就不执行。在C语言中&#xff0c;0表示假&#xff0c;非0表示真.下图表示if的执行过程&#xff1a; 1.2 else语句 当…

六位一线AI工程师总结大模型应用摸爬滚打一年的心得,网友:全程高能!

六位一线AI工程师和创业者&#xff0c;把在大模型应用开发上摸爬滚打一整年的心得&#xff0c;全&#xff01;分&#xff01;享&#xff01;了&#xff01; &#xff08;奇怪的六一儿童节大礼包出现了&#xff09; 这篇干货长文&#xff0c;一时间成为开发者社区热议的话题。…

大数据之HDFS磁盘扩容(linux磁盘扩容)

之所以扩容,是因为当前大数据平台已经接入了不同来源的数据,当执行mapreduce任务时,会发生磁盘爆满,导致hdfs爆红 具体扩容方案如下: 1、查看云磁盘分区情况 fdisk -l . 可以从图看出&#xff1a; /dev/vda 数据盘磁盘容量为21.5GB&#xff0c;包含/dev/vda1分区 /dev/vdb 数…

外贸干货|如何提高商机转化率?

常常听到外贸业务员抱怨“询盘质量不高”、“有询盘没转化”、“有些客户只是来比价格的”……想必大家都不陌生&#xff01; 但难道只有询盘问题、客户问题吗&#xff1f;我们自身的处理真的没问题吗&#xff1f;我想只有更多的自省自查我们可以控制的问题&#xff0c;优化我们…

性能测试 —— 吞吐量和并发量的关系? 有什么区别?

吞吐量&#xff08;Throughput&#xff09;和并发量&#xff08;Concurrency&#xff09;是性能测试中常用的两个指标&#xff0c;它们描述了系统处理能力的不同方面。 吞吐量&#xff08;Throughput&#xff09; 是指系统在单位时间内能够处理的请求数量或事务数量。它常用于…

高压电工工种考试题库

1、施工操作人员在作业活动后可以穿拖鞋、赤背(女职工禁穿高跟鞋)进入现场。 A正确 B 错误 2、力的三要素不会影响力的效果。 A 正确 B错误 3、如发现安全带的绳带有变质,应当立即停止使用。 A 正确 B错误 4、预防物体打击应该佩戴安全帽。 A 正确 B 错误 5、说明房屋建筑各层平…

APP兼容性测试都需要考虑哪些场景?

APP测试的时候都需要验证兼容性。那兼容性测试需要考虑哪些场景&#xff1f; 进行APP的兼容性测试时&#xff0c;需要考虑以下一些常见的测试场景&#xff1a; 1. 操作系统兼容性&#xff1a;测试应用程序在不同操作系统上的兼容性&#xff0c;如iOS、Android、Windows等。确…

突破语言与文化壁垒:海外短剧推广平台多语言支持技术的重要性与实施

在全球化的今天&#xff0c;语言和文化差异成为了海外短剧推广的一大挑战。为了吸引全球观众&#xff0c;海外短剧推广平台必须提供多语言支持&#xff0c;以突破语言与文化壁垒。本文将强调多语言支持的重要性&#xff0c;并探讨其实现技术。 一、多语言支持的重要性 随着全…

鸿蒙嵌入式设备开发之hello world

1. 环境搭建 目前鸿蒙设备的开发环境&#xff0c;可以分为2个部分&#xff1a;Windows调试环境&#xff0c;和Linux编译环境。 其中&#xff0c; Linux环境负责编译代码&#xff0c;并生成鸿蒙的包。Windows环境负责连接设备&#xff0c;进行烧录和调试。 特别注意&#xf…

读书笔记分享

1.绝大多数父母都是爱孩子的&#xff0c;可他们却不是称职的父母。世界上任何职业都要培训、考核、竞争上岗&#xff0c;唯有“父母”这个职业是没有这些程序&#xff0c;只要生了小孩&#xff0c;就是天经地义的父母。 2.由于自身工作特点&#xff0c;“白领”们的部分器官和…

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述&#xff1a; ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡ&#xff48;t nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt…

SD卡格式化怎么恢复?一键扫描,轻松找回丢失的数据

SD卡格式化怎么恢复数据&#xff1f;在日常生活中&#xff0c;我们常常会使用SD卡来存储各种数据&#xff0c;如照片、视频、文档等。然而&#xff0c;当SD卡意外格式化或者出现其他问题时&#xff0c;里面的数据就会面临丢失的风险。 此时&#xff0c;如何恢复格式化的SD卡就…

聚焦Cayman 环二核苷酸(CDNs)

环二核苷酸CDNs 环二核苷酸&#xff08;cyclic dinucleotides&#xff0c;CDNs&#xff09;是一类天然的环状RNA分子&#xff0c;细菌衍生的CDNs分子包括c-di-GMP、c-di-AMP和3,3-cGAMP&#xff0c;它们介导对恶性、病毒性和细菌性疾病的先天免疫的保护作用&#xff0c;并在自…

遇见桂林山水画廊,深层互联自动讲解耳机走进漓江

遇见山水&#xff0c;听懂山水。由深层互联独家打造&#xff0c;桂林漓江山水画廊导览工程&#xff0c;于不久前正式启动&#xff0c;声情并茂的真人语音引导着游客&#xff0c;走进有声有色的山水画卷中。 桂林山水甲天下&#xff0c;得天独厚的自然景观&#xff0c;奇幻瑰丽…

html5实现端午节网站源码

文章目录 1.设计来源1.1 端午首页页面1.2 端午由来页面1.3 端午图集页面1.4 端午活动页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/139524377 ht…