文章目录

  • 一、ArrayList的构造
  • 二、ArrayList常见操作
  • 三、ArrayList的遍历
  • 四、ArrayList练习
    • 1.【小练习】
    • 2.杨辉三角
    • 3.简单的洗牌算法
  • 五、ArrayList小结

在上一章节中,我们通过代码示例以及画图的方式详细了解了顺序表,并模拟实现了它。那么,是不是以后每次需要用到顺序表这种数据结构时,我们都需要先模拟实现顺序表之后才能使用呢?答案是否定的。 在Java中,提供了ArrayList类来帮助我们实现顺序表这种数据结构。ArrayList是一个普通的类,实现了List接口:
在这里插入图片描述
接下来,我们就来学习在Java中ArrayList类的具体用法。

一、ArrayList的构造

常见的ArrayList的构造有三种方式:

    public static void main(String[] args) {//构造ArrayList<Integer> arrayList = new ArrayList<>(); //无参构造List<Integer> list = new ArrayList<>(2); //指定顺序表容量List<Integer> list1 = new ArrayList<>(list); //参数为 顺序表}

分别是:无参构造、指定容量、参数为顺序表。因为ArrayList类实现了List接口,所以在进行构造时,等号左边既可以是ArrayList也可以是List。在使用第三种构造方法时,需注意:list中元素的类型必须与list1中元素的类型相同才行,否则会编译报错。

二、ArrayList常见操作

ArrayList类中提供了非常多的方法,使用频率最高的为以下这些:
在这里插入图片描述
这些方法绝大部分我们已经自己模拟实现过了,用法和我们模拟实现的一样,不过有一些特殊的方法需要特殊记忆:

    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);System.out.println(list); //[1, 2, 3, 4, 5]//addAll:添加一个顺序表中的所有元素list.addAll(list);System.out.println(list); //[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]//使用remove进行删除时,如果想要删除值,需要通过new关键字list.remove(2);System.out.println(list); //[1, 2, 4, 5, 1, 2, 3, 4, 5]list.remove(new Integer(2));System.out.println(list); //[1, 4, 5, 1, 2, 3, 4, 5]//使用subList对顺序表进行截取List<Integer> list1 = list.subList(1, 3); //左闭右开区间System.out.println(list1); //[4, 5]//当修改截取到的顺序表中的值时,原顺序表对应位置的值也会被修改list1.set(1, 666);System.out.println(list1); //[4, 666]System.out.println(list); //[1, 4, 666, 1, 2, 3, 4, 5]}

在上面这段代码中,我们还需注意一点:当调用无参的构造方法时,不会分配内存;默认是在第一次调用add方法时,分配大小为10的内存空间;当空间不够需要扩容时,默认以1.5倍大小进行扩容。

三、ArrayList的遍历

ArrayList的遍历有很多种方式:直接输出、for循环遍历以及迭代器:

    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);//方式一:soutSystem.out.println(list); //源码中重写了toString方法System.out.println("===========================");//方式二:for循环for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();for (Integer x : list) {System.out.print(x + " ");}System.out.println();System.out.println("===========================");/*** 方式三:迭代器* Iterator 和 ListIterator都可以遍历顺序表,ListIterator还可以逆序遍历*/Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println();ListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.print(listIterator.next() + " ");}System.out.println();//使用ListIterator逆序输出ListIterator<Integer> listIterator1 = list.listIterator(list.size());while (listIterator1.hasPrevious()) {System.out.print(listIterator1.previous() + " ");}System.out.println();}

在这些方式中,最常使用的是for-i循环以及for-each循环。

四、ArrayList练习

1.【小练习】

题目: 已知两个字符串s1、s2,现在要求:删除第一个字符串中出现的 所有的 第二个字符串中的字符:

根据题意,我们需要删除s1中出现的所有的s2中的字符,那么,我们就可以遍历s1,获取s1中所有的字符,看这个字符是否为s2中的字符,如果不是,我们就将此字符添加到顺序表中,最后返回一个顺序表即可。

    //编写一个方法实现主要操作public static ArrayList<Character> del(String s1, String s2) {//创建一个顺序表,接收s1中与s2中不重复的字符ArrayList<Character> arrayList = new ArrayList<>();//遍历s1for (int i = 0; i < s1.length(); i++) {//获取对应下标位置的字符char ch = s1.charAt(i);if (!s2.contains(ch + "")){arrayList.add(ch);}}return arrayList;}public static void main(String[] args) {//小练习String s1 = "welcome to victim";String s2 = "come";ArrayList<Character> ret = del(s1, s2); //接收返回值for (Character x : ret) {System.out.print(x);}}

2.杨辉三角

杨辉三角
在这里插入图片描述
在解决这道在线编程题时,我们需要注意理解代码模板中给出的返回值的含义:我们已经知道顺序表的底层其实是一个数组,那么对于本题中给出的返回值,我们就可以理解为其本质是一个二维数组:
在这里插入图片描述
我们为杨辉三角的每一行都创建一个顺序表,存储对应行中的数据元素,最后再将这些顺序表都存储到一个新的顺序表中,在这个新的顺序表中的每个元素都是一个顺序表。

我们再回归到这个数学问题本身,可以观察到,每一行的第一个元素和最后一个元素的值都为1,我们再将杨辉三角变换为直角三角形的形式进行观察,那么,每一个元素都是其上方元素和其上方元素的前一个元素的和。

class Solution {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> curRow = new ArrayList<>(); //每一行一个顺序表curRow.add(1); //顺序表的第一个元素List<Integer> preRow = list.get(i - 1); //获取上一行for(int j = 1; j < i; j++) {int x = preRow.get(j) + preRow.get(j - 1);curRow.add(x);}curRow.add(1); //顺序表的最后一个元素list.add(curRow); //添加到二维顺序表中}return list;}
}

3.简单的洗牌算法

现在有这样一个场景:有一副新的扑克牌(排除大小王),三个人玩,先开始洗牌,然后一人抓一张,抓五轮,看每个人都抓到的是什么牌:
在这里插入图片描述
我们先对牌进行定义:

public class Card {public String suit; //花色public int rank; //数字public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic String toString() {
//        return "Card{" +
//                "suit='" + suit + '\'' +
//                ", rank=" + rank +
//                '}';return suit + rank;}
}

接下来,我们依次完成定义一副新的牌、洗牌、发牌操作:

public class CardList {public static final String[] SUITS = {"♠", "♥", "♦", "♣"}; //定义四种花色//定义一副新的牌public static List<Card> newCard() {//用顺序表存放牌List<Card> list = new ArrayList<>();for (int i = 0; i < SUITS.length; i++) {for (int j = 1; j <=13 ; j++) {Card card = new Card(SUITS[i], j);list.add(card);}}return list;}//洗牌public static void washCard(List<Card> list) {//生成随机数交换牌,达到洗牌的目的Random random = new Random();for (int i = list.size() - 1; i > 0; i--) {int index = random.nextInt(i);swap(list, i, index);}}//交换牌private static void swap(List<Card> list, int i, int j) {Card tmp = list.get(i);list.set(i, list.get(j));list.set(j, tmp);}public static void main(String[] args) {List<Card> list = newCard();System.out.println(list);washCard(list);System.out.println(list);//用来存放三个人各自的牌List<Card> p1 = new ArrayList<>();List<Card> p2 = new ArrayList<>();List<Card> p3 = new ArrayList<>();//存放三个人List<List<Card>> p = new ArrayList<>();p.add(p1);p.add(p2);p.add(p3);//发牌for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {Card card = list.remove(0);p.get(j).add(card);}}System.out.println("A的牌:" + p.get(0));System.out.println("B的牌:" + p.get(1));System.out.println("C的牌:" + p.get(2));System.out.println("剩的牌:" + list);}
}

一个简单的洗牌算法就完成啦。

五、ArrayList小结

ArrayList底层是数组实现的,所以在进行有关查找的操作时,速度很快;但也是因为底层是数组实现的,这也导致了在进行增加或者删除操作时,需要逐个移动元素,效率很低,速度慢;在进行扩容操作时,1.5倍的扩容大小也可能会导致很多空间的浪费。


Ending。

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

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

相关文章

OpenCV的关于图片的一些运用

一、读取图片通过cv2库中的imread&#xff08;&#xff09;方法读取图片代码&#xff1a;import cv2 a cv2.imread(1.png) cv2.imshow(tu,a) b cv2.waitKey(4000) # 图片执行时间 cv2.destroyAllWindows() # 关闭所有端口 print("图像形状(shape):",a.shape) print…

【数据结构——并查集】

引入 并查集&#xff08;Disjoint Set Union&#xff0c;DSU&#xff09;是一种用于管理元素分组的数据结构。 合并&#xff08;Union&#xff09;&#xff1a;将两个不相交的集合合并为一个集合。 查找&#xff08;Find&#xff09;&#xff1a;确定某个元素属于哪个集合&…

在 Vue 中使用 ReconnectingWebSocket实现即时通讯聊天客服功能

在 Vue 中使用 ReconnectingWebSocketReconnectingWebSocket 是一个自动重连的 WebSocket 实现&#xff0c;非常适合在 Vue 项目中使用。下面是如何在 Vue 中集成和使用它的方法&#xff1a;搜索 "程序员老狼"安装 ReconnectingWebSocket首先&#xff0c;你需要安装…

智能体革命:网络安全人的角色重塑与突围指南

AI赋能千行百业的趋势不可逆转&#xff0c;当AI学会渗透测试&#xff0c;安全工程师的出路在哪里&#xff1f; 2025年8月7日&#xff0c;OpenAI正式发布GPT-5的消息刷屏科技圈。这个达到博士生水平的“统一”人工智能模型&#xff0c;将AI幻觉率降低60%&#xff0c;成本下降45%…

用于水T1值和脂肪分数量化的上半身自由呼吸磁共振指纹成像|文献速递-医学影像算法文献分享

Title题目Upper-body free-breathing Magnetic Resonance Fingerprinting applied tothe quantification of water T1 and fat fraction用于水T1值和脂肪分数量化的上半身自由呼吸磁共振指纹成像 01文献速递介绍磁共振指纹成像&#xff08;MRF&#xff09;是十年前推出的一种高…

Apache RocketMQ:消息可靠性、顺序性与幂等处理的全面实践

Apache RocketMQ 是一个高性能、高可靠的分布式消息中间件&#xff0c;广泛应用于异步通信、事件驱动架构和分布式系统中。本文深入探讨 RocketMQ 的消息可靠性、顺序性和幂等处理机制&#xff0c;结合 Redisson 分布式锁实现幂等消费&#xff0c;提供详细的代码示例和实践建议…

无服务器日志分析由 Elasticsearch 提供支持,推出新的低价层

作者&#xff1a;来自 Elastic Log Analytics Elastic Observability Logs Essentials 在 Elastic Cloud Serverless 上提供成本效益高、无麻烦的日志分析。 SREs 可以摄取、搜索、丰富、分析、存储和处理日志&#xff0c;而无需管理部署的运营开销。[](https://www.elastic.co…

(Arxiv-2025)Phantom-Data:迈向通用的主体一致性视频生成数据集

Phantom-Data&#xff1a;迈向通用的主体一致性视频生成数据集 paper是字节发布在Arxiv2025的工作 paper title&#xff1a;Phantom-Data: Towards a General Subject-Consistent Video Generation Dataset Code&#xff1a;链接 Abstract 近年来&#xff0c;主体到视频&#…

如何解决pip安装报错ModuleNotFoundError: No module named ‘mlflow’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘mlflow’问题 摘要 在Python开发中&#xff0c;pip install 报错是一种常见问题&#xff0c;尤其是在使用集成开发环境&#xff08;IDE&#xff09;如PyCharm时…

2020/12 JLPT听力原文 问题一 3番

3番&#xff1a;会社で女の人と男の人が話しています。女の人は倉庫に入るとき、どの順番で入口のボタンを押さなければなりませんか。 女&#xff1a;すみません。地下の倉庫に行って、資料を取ってきたいんですが、入口の開け方がわからなくて… 男&#xff1a;ああ、最近、管…

C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

基于强化学习的目标跟踪 研究初探

强化学习 目标跟踪Visual tracking by means of deep reinforcement learning and an expert demonstratorYOLO 检测下基于 ETC-DDPG 算法的无人机视觉跟踪基于特征与深度强化学习方法的机器人视觉伺服技术研究高性能可拓展视频目标跟踪算法研究基于目标运动与外观特征的多目标…

排序与查找,简略版

数组的排序 排序的基本介绍 排序是将一组数据&#xff0c;按照一定顺序进行排列的过程 排序的分类&#xff1a; 内部排序&#xff1a; 一次性适用数据量小的情况 将需要处理的数据都加载到内部存储器中进行排序。包括交换式排序&#xff0c;选择式排序&#xff0c;插入式排序 外…

打靶日常-XSS(反射型和存储型)

目录 小皮: 1. 2.这里需要登录,我们之前爆破出账号密码在这里就可以用​编辑 登录之后:​编辑 使用工具: 先输入正确字符进行测试:aaa 进行测试: 3.换种控制台显示 结果:(使用f12大法) DVWA: 反射型XSS: 低: ​编辑 中:大小写绕过: ​编辑 也可以双写绕过: ​编…

二叉搜索树深度解析:从原理实现到算法应用----《Hello C++ Wrold!》(18)--(C/C++)

文章目录前言二叉搜索树&#xff08;二叉排序树或二叉查找树&#xff09;二叉搜索树的模拟实现二叉搜索树和有序数组二分查找的比较两个搜索模型作业部分前言 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;作为一种重要的树形数据结构&#xff0…

牛客.空调遥控二分查找牛客.kotori和气球(数学问题)力扣.二叉树的最大路径和牛客.主持人调度(二)

目录 牛客.空调遥控 二分查找 牛客.kotori和气球&#xff08;数学问题) 力扣.二叉树的最大路径和 牛客.主持人调度(二) 牛客.空调遥控 枚举n个空调之后&#xff0c;使数组有序&#xff0c;左右下标&#xff0c;用二分查找&#xff0c;然后一个求 长度就好 二分查找 /二分理…

《嵌入式Linux应用编程(二):标准IO高级操作与文件流定位实战》

今日学习内容1. 行输入函数安全实践(1) fgets vs gets函数安全特性换行符处理缓冲区保护fgets指定读取长度&#xff08;size-1&#xff09;保留\n并添加\0安全&#xff08;防溢出&#xff09;gets无长度限制将\n替换为\0危险2. Linux标准文件流文件流符号设备 标准输入stdin键盘…

Springboot2+vue2+uniapp 小程序端实现搜索联想自动补全功能

目录 一、实现目标 1.1 需求 1.2 实现示例图: 二、实现步骤 2.1 实现方法简述 2.2 简单科普 2.3 实现步骤及代码 一、实现目标 1.1 需求 搜索联想——自动补全 &#xff08;1&#xff09;实现搜索输入框&#xff0c;用户输入时能显示模糊匹配结果 &am…

极简 5 步:Ubuntu+RTX4090 源码编译 vLLM

极简 5 步&#xff1a;UbuntuRTX4090 源码编译 vLLM1. 系统依赖&#xff08;一次性&#xff09;2. 进入源码目录 & 激活环境3. 启用 ccache 自动并行度4. 拉代码 编译&#xff08;2 行搞定&#xff09;5. 更新 flash-attn&#xff08;与 vLLM 配套&#xff09;6. 启动 4 …

生产工具革命:定制开发开源AI智能名片S2B2C商城小程序重构商业生态的范式研究

摘要互联网作为信息工具已深刻改变商业生态&#xff0c;但其本质仍停留在效率优化层面。本文提出&#xff0c;基于定制开发开源AI智能名片与S2B2C商城小程序的深度融合&#xff0c;正在引发生产工具层面的革命性变革。该技术架构通过重构"人-货-场"关系&#xff0c;实…