【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.rhkb.cn/news/343062.html

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

相关文章

【JMeter接口测试工具】第一节.JMeter简介和安装【入门篇】

文章目录 前言一、JMeter简介 1.1 JMeter基本介绍 1.2 JMeter优缺点二、JMeter安装 2.1 JMeter安装步骤 2.2 JMeter环境配置三、项目介绍 3.1 项目简介 3.2 API接口清单总结 前言 一、JMeter简介 1.1 JMeter基本介绍 JMeter 是 Apache 组织使用…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频&#xff1a;https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接&#xff0c;不保证稳定可用哦&#xff1a; https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

【全开源】CMS内容管理系统(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统&#xff0c;自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署&#xff0c;UniAPP版本提供全部无加密UniAPP源码​ &#x1f50d; 解锁内容管理新境界&#xff1a;C…

巧用Jmeter Debug sampler获取变量信息

Jmeter Debug sampler介绍 Jmeter Debug sampler 可以帮助我们解决如下问题&#xff1a; debug参数化的变量取值是否正确 debug正则表达式提取器&#xff08;或json提取器&#xff09;提取的值是否正确 查看 JMeter 属性 具体使用方法 前提条件&#xff1a;添加查看结果树…

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

运维监控领域你不得不知道的黑话-下篇

作者&#xff1a;Tshb 引言 书接上回&#xff1a;《运维监控领域你不得不知道的黑话-中篇》。 在上一讲中&#xff0c;我们对监控系统中的四种指标类型进行了详细的阐述。不同类型的指标可以提供不同维度的系统信息&#xff0c;通过对比不同类型的指标&#xff0c;可以让我们…

软硬件集成项目,这个项目管理软件做的成本预算管理深得我心

最近&#xff0c;我负责了一个中大型的软硬件集成的项目&#xff0c;是对某单位的车间进行智能化改造&#xff0c;以提高生产效率&#xff0c;要确保设备运行的稳定性和安全性。项目会涉及到大量的硬件采购、安装以及多个软件的开发、集成&#xff0c;所以在实施过程中遇到了多…

vue 如何制作一个跟随窗口大小变化而变化的组件

vue 如何制作一个跟随窗口大小变化而变化的组件 像下图中展示的那些统计数件就是跟随窗口变化而变化的&#xff0c;而且是几乎等比缩放的。 实现原理 只简略说一下原理。 pinia 中记录一个窗口变化的高度值给要变化的组件添加一个高度值组件内部所有关于长度距离的值都通过这…

(uniapp)简单带动画的tab切换效果

效果图 代码 <template><view class"tabBox"><view :style"{transform: translateX(${translateX})}" class"whiteBox"></view><view click"changeTab(k)" class"itemBox" v-for"(v,k) in…

分享一个 .Net core Console 项目使用 SqlSugar 的详细例子

前言 SqlSugar 是一款老牌的 .NET 开源 ORM 框架&#xff0c;性能高&#xff0c;功能全面&#xff0c;使用简单&#xff0c;支持 .NET FrameWork、.NET Core3.1、.NET5、.NET6、.NET7、.NET8、.NET9 等版本&#xff0c;线上论坛非常活跃&#xff0c;今天给大伙分享一个 .Net c…

Web3的应用场景分析

Web3&#xff0c;即基于区块链技术的去中心化互联网&#xff0c;正逐渐改变我们与数字世界的互动方式。以下是Web3的一些主要应用场景。Web3技术正在各个领域推动创新&#xff0c;创造更多透明、开放和去中心化的解决方案&#xff0c;为用户带来更高的自主权和安全性。北京木奇…

【全开源】同城招聘SAAS信息前程无忧直聘达小程序

招聘SAAS&#xff1a;数字化转型中的招聘新助力 基于ThinkPHP和原生微信小程序开发的招聘平台系统&#xff0c;包含微信小程序求职者端、微信小程序企业招聘端、PC企业招聘端、PC管理平台端​ &#x1f31f; 一、招聘SAAS简介 在人力资源领域&#xff0c;数字化转型已成为不…

工会考试基础知识题库分享(附答案解析)

单选题 1、国家机关在组织起草或者修改直接涉及职工切身利益的法律、法规、规章时&#xff0c;( )工会意见。 A、可以听取 B、应当听取 C、必须听取 D、应当吸收 [答案]B 【解析】国家机关在组织起草或者修改直接涉及职工自身利益的法律、法规、规章时&#xff0c;应当听取工…

如何查询公网IP?

在互联网中&#xff0c;每个设备都有一个唯一的公网IP地址&#xff0c;用于标识设备在全球范围内的位置。查询公网IP是一个常见的需求&#xff0c;无论是用于远程访问、网络配置还是其他目的&#xff0c;了解自己的公网IP地址都是很有必要的。本文将介绍几种常见的方法来查询公…

面向AI应用开发实战分享 - 基础篇

“前端转AI&#xff0c;第一讲来了” 引言 如果你是一名前端开发&#xff0c;同时又对AI开发很感兴趣&#xff0c;那么恭喜你&#xff0c;机会来了。 如果不是也没关系&#xff0c;同样能帮大家了解AI应用的开发思路。 本文将带大家从面向AI开发的基础知识开始&#xff0c;再…

攻防实战 | 邮件高级威胁检测与自动化响应

历经三个月的时间&#xff0c;年度重磅直播节目Fortinet 2024年度“Demo季”近日终于迎来了备受瞩目的压轴大戏——Demo Day第三期&#xff0c;主题为《新邮件安全下的高级威胁检测与自动化响应》。继成功举办了前两期《企业网络中的多源威胁情报自动化整合与集成》和《应急响应…

人工智能绘画的历史

人工智能绘画的起源可以追溯到20世纪50年代。当时&#xff0c;艺术家和科学家开始使用计算机生成图像和图形&#xff0c;将绘画艺术与技术领域相结合。计算机图像可以被视为人工智能绘画的一部分。下面&#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…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍&#xff1a; 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上&#xff0c;能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…