【数据结构-JAVA】ArrayList

news/2024/5/20 7:48:59/文章来源:https://blog.csdn.net/qq_41233305/article/details/128316360

目录

1. 线性表

2. 顺序表(ArrayList)

    2.1 什么是顺序表?

    2.2 顺序表的使用

        2.2.1 ArrayList 的构造方法

        2.2.2 ArrayList 的常规操作

        2.2.3 ArrayList 的遍历

    2.3 顺序表的优缺点

3. 练习题

    3.1 练习1 一道面试题

    3.2 练习2 杨辉三角形

    3.3 练习3 洗牌算法

    3.4 List<Integer> 还是 ArrayList<Integer> ?


1. 线性表

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

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

2. 顺序表(ArrayList)

2.1 什么是顺序表?

我们知道,要对数组进行增删查改等操作,就需要用到一些方法,把这些方法跟数组抽象成一个类,就成了顺序表(ArrayList)。那么顺序表可以有以下定义:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.2 顺序表的使用

2.2.1 ArrayList 的构造方法

方法解释
ArrayList()无参构造 
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

 1. 无参的构造方法:

可以看到,依旧未给 elementData 这个数组分配空间。

2. 指定顺序表初始容量:

 3. 利用其他 Collection 构建 ArrayList :

?是通配符,具体内容待后面文章讲解。

ArrayList(Collection<? extends E> c) 的意思是:传入的类一定是实现了 Collection 这个接口的,并且其泛型的参数类型是 E (E 是 ArrayList 泛型参数类型)或是 E 的子类。

    public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(666);list.add(888);list.add(999);ArrayList<Number> arrayList = new ArrayList<>(list);arrayList.add(101);System.out.println(arrayList);}

通过上图可知,LinkedList 类是实现 Collection 接口的,并且代码中,其泛型接收的参数类型是 Integer ,而 ArrayList 的泛型接收的参数类型是 Number,我们知道 Integer 是 Number 的子类。

2.2.2 ArrayList 的常规操作

ArrayList 虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,同学们自行查看 ArrayList 的帮助文档。

方法解释
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> 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
import java.util.ArrayList;
import java.util.List;public class Text {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();//尾插:arrayList.add("trees");arrayList.add("the sun");//指定位置插入元素:arrayList.add(1,"flowers");//尾插 List 类型 list 对象中的元素:List<String> list = new ArrayList<>();list.add("blue sky");list.add("birds");list.add("grass");arrayList.addAll(list);System.out.println(arrayList);//获取某下标的元素:System.out.println(arrayList.get(0));//将某下标的元素设置成输入元素:arrayList.set(0,"forests");System.out.println(arrayList);//删除指定下标的元素:arrayList.remove(2);System.out.println(arrayList);//删除首个输入的元素:arrayList.remove("blue sky");System.out.println(arrayList);//判断某元素是否在 arraylist 中:System.out.println(arrayList.contains("grass"));//返回首个输入元素的下标:System.out.println(arrayList.indexOf("birds"));}
}

2.2.3 ArrayList 的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器,前两种是遍历 ArrayList 的最常用的方法。

1. for循环+下标

public class Text {public static void main(String[] args) {List<Character> arrayList = new ArrayList<>();arrayList.add('S');arrayList.add('O');arrayList.add('S');for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}}
}

2. foreach

    public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("Romeo");arrayList.add(" and ");arrayList.add("Juliet");for(String x:arrayList){System.out.print(x);}}

3. 使用迭代器

    public static void main(String[] args) {List<Integer> arrayList = new ArrayList<>();arrayList.add(100);arrayList.add(101);arrayList.add(102);arrayList.add(103);ListIterator<Integer> iterator = arrayList.listIterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");}}

2.3 顺序表的优缺点

顺序表的优点:

1. 当下标给定时,查找速度非常快,时间复杂度为 O(1),ArrayList 更适合于给定下标查找元素。

顺序表的缺点:

1. ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N),基于此,顺序表不适合频繁对数据进行插入和删除。

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

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继 续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

3. 练习题

3.1 练习1 一道面试题

要求删除 S1 中出现在 S2 的字符,使 S1 :wl t th prgraing wrld!

S1 :"welcome to the progamming world!"

S2 : "come"

import java.util.ArrayList;
import java.util.List;public class Text {public static void main(String[] args) {List<Character> list = new ArrayList<>();String s1 = "welcome to the programming world!";String s2 = "come";for (int i = 0; i < s1.length(); i++) {char ch = s1.charAt(i);if(!s2.contains(ch+"")){list.add(ch);}}for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}}
}

3.2 练习2 杨辉三角形

 根据分析可知,杨辉三角每一行的值可以使用二维数组来存放,并且有 [i][j] = [i-1][j-1] + [i-1][j] 的规律:

 因此,可以写出以下代码:

    public List<List<Integer>> generate(int numRows) {List<List<Integer>> list = new ArrayList<>();List<Integer> row = new ArrayList<>();row.add(1);list.add(row);for (int i = 1; i < numRows; i++) {List<Integer> prerow = list.get(i-1);List<Integer> currow = new ArrayList<>();//每一行的第一个 1currow.add(1);//中间部分的值for (int j = 1; j < prerow.size(); j++) {currow.add(prerow.get(j) + prerow.get(j-1));}//最后一行的 1currow.add(1);list.add(currow);}return list;}

 3.3 练习3 洗牌算法

每一张牌抽象成一个类:

public class Poker {private String suit ;private int number;public Poker(String suit, int number) {this.suit = suit;this.number = number;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}@Overridepublic String toString() {return "{"+ suit +   + number +'}';}
}

一副扑克牌的制作,洗牌,分牌这些操作放在 Game 这个类中: 

import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Game {public static final String[] suits = {"♠","♥","♣","♢"};public List<Poker> buyPokers(){List<Poker> pokers = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {Poker poker = new Poker(suits[i],j);pokers.add(poker);}}return pokers;}public void shuffle(List<Poker> pokers){for (int i = pokers.size()-1; i >0 ; i--) {Random random = new Random();int index = random.nextInt(i);swap( pokers,i,index);}}public void swap(List<Poker> pokers,int i,int j){Poker temp = pokers.get(i);pokers.set(i,pokers.get(j));pokers.set(j,temp);}public List<List<Poker>> game(List<Poker> pokers){List<List<Poker>> hand = new ArrayList<>();List<Poker> hand1= new ArrayList<>();List<Poker> hand2= new ArrayList<>();List<Poker> hand3= new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {hand.get(j).add(pokers.remove(0));}}return hand;}
}

在 Text 类调用 Game 类: 

public class Text {public static void main(String[] args) {Game game = new Game();//得到一副除去大小王的牌:List<Poker> pokers = game.buyPokers();System.out.println(pokers);//洗牌:game.shuffle(pokers);System.out.println(pokers);//三人轮流抽五张牌:List<List<Poker>> hand = game.game(pokers);for (int i = 0; i < hand.size(); i++) {System.out.println("第"+(i+1)+"个人的牌为"+hand.get(i));}//剩下的牌为:System.out.println(pokers);}
}

输出:

3.4 List<Integer> 还是 ArrayList<Integer> ?

List<Integer> pokers = new ArrayList<>(); 

用接口对象接收,好处是发生了向上转型以及可以接收所有实现这个接口的对象,但坏处也很明显,那就是只能使用 List 类里的属性和方法。

 ArrayList<Integer> pokers = new ArrayList<>(); 

该种写法,当前类的方法都能调用。

 两种写法其实都行,根据具体的需要来决定用哪一种。

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

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

相关文章

PreSTU:一个专门为场景文本理解而设计的简单预训练模型

摘要&#xff1a;在视觉与语言&#xff08;V&L&#xff09;模型中&#xff0c;阅读和推理图像中的文本的能力往往是缺乏的。我们如何才能学习出强大的场景文本理解&#xff08;STU&#xff09;的V&L模型呢&#xff1f;本文分享自华为云社区《场景文本理解预训练PreSTU》…

如何进行系统设计

文章目录1. 理解需求1.1 功能性需求1.2 非功能性需求2. 系统设计3. Api设计4. 数据模型设计5. 高可用、高性能、可监控等数据密集型应用设计凤凰架构 重点&#xff1a;自己整理的非权威&#xff0c;不具代表性&#xff0c;自己去取舍哈。 1. 理解需求 1.1 功能性需求 解决什么…

深度学习 Day22——利用LSTM实现火灾温度预测

深度学习 Day22——利用LSTM实现火灾温度预测 文章目录深度学习 Day22——利用LSTM实现火灾温度预测一、前言二、我的环境三、LSTM介绍1、长期依赖的问题2、LSTM3、LSTM结构四、前期工作1、设置GPU2、导入数据3、数据可视化五、构建数据集1、设置X、y2、设置归一化3、划分数据集…

宽凳科技完成超亿元B1轮融资 率先突破高精地图量产落地

近日&#xff0c;国内领先的高精地图及其智能应用综合解决方案服务商宽凳科技宣布完成B1轮超亿元融资。本轮融资由聚焦于新能源汽车产业链投资及新兴技术产业投资的紫峰资本与信益资本联合领投&#xff0c;崇业投资跟投&#xff0c;同时本轮资本引入了德清政府战略投资&#xf…

Vue3 —— 使用Vite配置环境变量

文章目录 一、为什么要配置环境变量?二、在Vite中配置环境变量 1.环境变量和模式2.环境变量3.生产环境替换4.env 文件总结一、为什么要配置环境变量? 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然…

如何计算香港服务器公网带宽的实际下载速度?

如何计算香港服务器公网带宽的实际下载速度?下面分享香港服务器带宽实际下载速度对照表及计算方法&#xff1a; 香港服务器带宽实际下载速度计算方法 香港服务器以1Mbps公网带宽为例&#xff0c;香港服务器1M带宽实际下载速度峰值128KB/S&#xff0c;为什么不是1M/S&#xff0…

educoder:实验13 算法-穷举法和二分法

第1关&#xff1a;百钱百鸡 任务描述 我国古代数学家张丘建在《算经》一书中提出的数学问题&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 相关知识 为了完成本关任务&#xff…

《纳瓦尔宝典》笔记三——做自己真正感兴趣的事情

你合上书本&#xff0c;留在你脑子里的才真正是你的智慧 目录 一、开始让你兴致盎然&#xff0c;后来又让你觉得索然无味了吗 二、在“成为自己”这件事“上&#xff0c;没有人比你做得好 三、专长无法被教授&#xff0c;但可以被学习 四、上学能带来什么 五、尽量做不需…

OM6621系列国产M4F内核低功耗BLE5.1大内存SoC蓝牙芯片

目录OM6621系列简介OM6621P系列芯片特性应用领域OM6621系列简介 随着5G与物联网时代的到来&#xff0c;智慧城市、电动出行、智能家居、可穿戴设备等应用高速发展&#xff0c;低功耗蓝牙技术在近几年智能化浪潮中的地位也尤为重要。OM6621系列的开发即是为解决国内低功耗蓝牙应…

[整型/浮点型二分算法详解]二分查找算法真的很简单吗

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、二分查找是什么二、二分查找…

Linux操作系统的安全合规性检查和加固

1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号&#xff0c;降低安全风险。 操作步骤 使用命令 userdel 删除不必要的账号。 使用命令 passwd -l 锁定不必要的账号。 使用命令 passwd -u 解锁必要的账号。 1.2 检查特殊账号 检查是否存在空口令和root权限的账号…

DSPE-PEG-N3,磷脂-聚乙二醇-叠氮 点击化学PEG试剂,可用于药物传递、基因转染和生物分子修饰

中文名称 叠氮聚乙二醇磷脂、磷脂聚乙二醇叠氮 简称 N3-PEG-DSPE、DSPE-PEG-N3 物理性质&#xff1a;米白色/白色固体或粘性液体取决于分子量。 溶剂&#xff1a; 溶于大部分有机溶剂&#xff0c;和水有很好的溶解性。 活性基团&#xff1a; N3 反应基…

C++ Reference: Standard C++ Library reference: Containers: map: map: find

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/find/ 公有成员函数 <map> std::map::find iterator find (const key_type& k); const_iterator find (const key_type& k) const;获取指向元素的iterator 在容器中搜索键值等于k的元素&…

和ChatGPT大战多个回合,我知道了这些真相

最近&#xff0c;ChatGPT在国内外社交平台上可谓是火出圈了。作为一款人工智能语言模型&#xff0c;它可以和人类以对话的方式进行互动&#xff0c;比你早已熟知的Siri&#xff0c;小度还有小爱同学要更加智能与专业。因为它除了回答问题外还能进行创作&#xff0c;比如写小作文…

服务器多用户共享Anaconda

实验室最近买了台服务器&#xff0c;这篇Blog用来记载一下给ubuntu 20.04的服务器安装一个共享的anaconda的步骤。 安装Anaconda 首先去anaconda的官网下载linux的安装包&#xff0c;推送到服务上。然后进行安装&#xff1a; sudo bash ./Anaconda3-2022.10-Linux-x86_64.sh…

病毒之Worm.Win32.AutoRun

题外话&#xff1a;在被奥密克戎包围的我(两个室友和我&#xff0c;一个低烧、一个咳嗽、就差我了&#xff0c;这属实是真被包围了丫)在和Worm.Win32.AutoRun决一死战… 本次Worm.Win32.AutoRun的来源&#xff1a; windows电脑上重装vscode&#xff0c;然后没有 mingw-get-setu…

Scala环境搭建

目录1&#xff09;安装步骤2&#xff09;测试3&#xff09;IDEA安装Scala 插件1&#xff09;安装步骤 1.首先确保 JDK1.8 安装成功 2.下载对应的 Scala 安装文件 scala-2.x.zip 3.解压 scala-2.12.11.zip&#xff0c;我这里解压到 F:\software 4.配置 Scala 的环境变量 …

全面解析若依框架(springboot-vue前后分离--后端部分)

1、 若依框架分解 - 启动配置 前端启动 # 进入项目目录 cd ruoyi-ui# 安装依赖 npm install# 强烈建议不要用直接使用 cnpm 安装&#xff0c;会有各种诡异的 bug&#xff0c;可以通过重新指定 registry 来解决 npm 安装速度慢的问题。 npm install --registryhttps://regist…

python 之 numpy图片处理 矩阵操作

目录 一&#xff1a;垂直方向翻转(行逆序) 二&#xff1a;水平方向翻转(列逆序) 三&#xff1a;垂直、水平方向翻转(行、列逆序) 四&#xff1a;调整亮度&#xff0c;变明亮*2.0 五&#xff1a;调整亮度&#xff0c;变暗 六&#xff1a;垂直方向裁剪 七&#xff1a;水平…

漏洞深度分析|Pgadmin 命令执行漏洞

项目介绍 PostgreSQL是世界上第四大流行的开源数据库管理系统&#xff0c;它在各种规模的应用程序中得到了广泛的使用。而管理数据库的传统方法是使用命令行界面(CLI)工具。 PostgreSQL的图形化用户界面(GUI)工具则可以帮助用户对数据库实现更好的管理、操纵、以及可视化其数…