【Java数据结构】ArrayList类
List接口
List是一个接口,它继承Collection接口,Collection接口中的一些常用方法

List也有一些常用的方法。List是一个接口,它并不能直接实例化,ArrayList和LinkedList都实现了List接口,它们的常用方法都很相似。

ArrayList
认识ArrayList

ArrayList是一个类,它实现了List接口。ArrayList内部其实是一个数组,首先会默认一个初始数组容量,如果数组容量不足就需要扩容来存放数据(扩容是当前数组的一倍)。通过一些方法进行存放,它继承类List接口中的所有方法。ArrayList通常都是以泛型的方式实现的,所以使用这个类时要先实例化一个对象(ArrayList arrayList = new ArrayList())。
顺序表就是地址连续的一块空间,用来存储数据的线性结构。ArrayList其实就像一个顺序表,它将数据存储在数组中,然后对这个数组(通过一些方法)进行增删改查。
ArrayList的创建
首先需要构造一个对象,可以无参构造(较为常用,在其里初始化一个数组)。

模拟实现ArrayList
下面我们来分析ArrayList是如何实现的:
首先我们先了解ArrayList类中有什么,有两个属性一个是数组,还有一个是计数的,还有构造方法,也有一系列方法的实现,我们现在就来模拟一个ArrayList类:
public class MyList {public int[] array;public int size = 0;private static final int CAPACITY = 5;public MyList(){this.array = new int[CAPACITY];this.size = size;}//显示public void disPlay(){for(int i = 0; i < size; i++ ){System.out.print(array[i]+" ");}System.out.println();}//容量是否为满public boolean isFull(){if(size == array.length){return true;}return false;}//增public void add(int data){if (isFull()){//扩容array = Arrays.copyOf(array,2*array.length);}array[size] = data;size++;}//位置是否合法public void isLegal(int pos){if (pos < 0 || pos > size - 1){//System.out.println("位置不合法");throw new PosOutException(pos+"位置不合法");}}//删public void del(int pos){isLegal(pos);for (int i = pos; i < size; i++){array[i] = array[i+1];}size--;}//改public void change(int pos, int data){isLegal(pos);array[pos] = data;}//查找public void find(int data){for (int i = 0; i < size; i++){if(array[i] == data){System.out.println("找到了,下标为"+i);return ;}}System.out.println("该数据找不到");}//置为零public void clear(){size = 0;}
}
一般写完一个方法的时候就先调用一下方法看看是否符合自己所想的,如何调用:就是在主方法里测试。例如下的方法,我使用的是ArrayList自带的方法:
public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);}
ArrayList的遍历
ArrayList中遍历有三种遍历方法,分别是:
1.for循环
//1(循环)遍历
for(int i = 0; i < list.size(); i++){System.out.print(list.get(i)+" ");
}
2.使用增强for循环
//2(只)遍历
for(Integer x: list){System.out.print(x+" ");
}
3.使用迭代器
//3迭代器
Iterator<Integer> it =list.iterator();
while(it.hasNext()){System.out.print(it.next()+" ");
}
System.out.println();
ArrayList常用的方法
构造完就可以对这个对象进行操作(例:增删该查等),使用的话就需要记住常用的方法:

我们现在一个一个实现
- boolean add(E e);//尾插
public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();arraylist.add(12);//将12插入到数组末尾//arraylist.add("abcd");//泛型为Integer,将这个对象限制在这个类型了arraylist.add(23);System.out.println(arraylist);//结果为[12, 23];}
- void add(int index, E e);//将e插入到index位置
public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();//将index下标的插入element数据arraylist.add(0, 12);arraylist.add(0,23);//arraylist.add(2,23);//该数组中只存在0和1下标位置的数组,超过了就会出现数组越界System.out.println(arraylist);//结果为[12, 23];}
- boolean addAll(Collection<? extend E>);//尾插c中的元素
public static void main(String[] args) {//创建顺序表ArrayList<Integer> arraylist1 = new ArrayList<>();arraylist1.add(12);arraylist1.add(23);//创建一个新的顺序表,将新的所有数据都尾插到原来顺序表中ArrayList<Integer> arraylist2 = new ArrayList<>();arraylist2.add(34);arraylist2.add(56);arraylist1.addAll(arraylist2);System.out.println(arraylist1);//结果为[12, 23];}
- E remove(int index);//删除index位置的元素
public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();arraylist.add(12);arraylist.add(23);//删除下标为0数,arraylist.remove(0);System.out.println(arraylist);//结果为[23];}
- boolean remove(Object o);//删除遇到第一个o
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("111");arrayList.add("aaa");arrayList.add("12");arrayList.add("aaa");//删除遇到的第一个o,相反没有遇到就不删除arrayList.remove("aaa");arrayList.remove("1");System.out.println(arrayList);}
- E get(int index);//获取下标index位置元素
public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);//获取下标index位置元素System.out.println(arrayList.get(1));//结果是[23]}
- E set(int index, E element);//将下标index位置元素设置为element
public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);arrayList.add(34);//将下表index位置元素设置为elementarrayList.set(2,555);System.out.println(arrayList);//结果为[12, 23, 555]}
- void clear();//清空
public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);arrayList.add(34);//清空arrayList中所有数据arrayList.clear();System.out.println(arrayList);//结果为[]}
- boolean contains(Object o);//判断o是否在线性表中
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");//判断是否存在oSystem.out.println(arrayList.contains("come"));System.out.println(arrayList.contains("coming"));System.out.println(arrayList);//结果为[hello, world , coming]}
- int indexOf(Object o);//返回第一个o所在下标
- int lastIndexOf(Object o);//返回最后一个o的下标
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");arrayList.add("hello ");//返回下标System.out.println(arrayList.indexOf("hello "));//返回第一次遇到o的下标System.out.println(arrayList.lastIndexOf("hello "));//返回最后一个遇到o的下标System.out.println(arrayList);//结果为[hello, world , coming, hello ]}
- List<E> subList(int fromIndex, int toIndex);//截取部分链表,从fromIndex到toIndex
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");arrayList.add("hello ");//List<String> arrayList1 = arrayList.subList(1,2);//截取从1到2的下标,且满足左闭右开System.out.println(arrayList1);//结果是[world ]}
以上就是ArrayList中常见的方法,我们可以通过ArrayList中的方法实现一些算法,下一节讲这些算法嗷~
相关文章:
【Java数据结构】ArrayList类
List接口 List是一个接口,它继承Collection接口,Collection接口中的一些常用方法 List也有一些常用的方法。List是一个接口,它并不能直接实例化,ArrayList和LinkedList都实现了List接口,它们的常用方法都很相似。 Ar…...
HDR视频技术之十:MPEG 及 VCEG 的 HDR 编码优化
与传统标准动态范围( SDR)视频相比,高动态范围( HDR)视频由于比特深度的增加提供了更加丰富的亮区细节和暗区细节。最新的显示技术通过清晰地再现 HDR 视频内容使得为用户提供身临其境的观看体验成为可能。面对目前日益…...
71 mysql 中 insert into ... on duplicate key update ... 的实现
前言 这个也是我们经常可能会使用到的相关的特殊语句 当插入数据存在 唯一索引 或者 主键索引 相关约束的时候, 如果存在 约束冲突, 则更新目标记录 这个处理是类似于 逻辑上的 save 操作 insert into tz_test_02 (field1, field2) values (field11, 11) on duplicate …...
计算机网络-GRE Over IPSec实验
一、概述 前情回顾:上次基于IPsec VPN的主模式进行了基础实验,但是很多高级特性没有涉及,如ike v2、不同传输模式、DPD检测、路由方式引入路由、野蛮模式等等,以后继续学习吧。 前面我们已经学习了GRE可以基于隧道口实现分支互联&…...
你的第一个博客-第一弹
使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架,适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统,支持用户注册、登录、发布文章等功能。 步骤: 安装 Flask 和其他必要库: 在开发博客之前,首…...
若依启动项目时配置为 HTTPS 协议
文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:修改 vue.config.js 文件第二步:运行项目第三步:处理浏览器警告 6、运行结果 1、需求提出 在开发本地项目时,默认启动使用的是 HTTP 协议。但在某些测试…...
学习思考:一日三问(学习篇)之匹配VLAN
学习思考:一日三问(学习篇)之匹配VLAN 一、学了什么(是什么)1.1 理解LAN与"V"的LAN1.2 理解"V"的LAN怎么还原成LAN1.3 理解二层交换机眼中的"V"的LAN 二、为何会产生需求(为…...
[WiFi] WiFi 802.1x介绍及EAP认证流程整理
802.1X Wi-Fi 802.1X 是一种网络访问控制协议,常用于保护无线网络。它提供了一种基于端口的网络访问控制机制,主要用于在用户和网络之间建立安全的连接。以下是 802.1X 的一些关键特点: 认证框架 802.1X 使用 EAP(可扩展认证协议…...
用C#(.NET8)开发一个NTP(SNTP)服务
完整源码,附工程下载,工程其实也就下面两个代码。 想在不能上网的服务器局域网中部署一个时间服务NTP,当然系统自带该服务,可以开启,本文只是分享一下该协议报文和能跑的源码。网上作为服务的源码不太常见,…...
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
MyBatis 是一个用于简化数据库操作的框架,它可以帮助开发人员通过映射语句轻松执行 SQL 查询,并且能够方便地实现对象与数据库表之间的映射。MyBatis 支持一对一、一对多和多对多等关联查询。下面我们来探讨一下 MyBatis 如何实现一对一、一对多的关联查…...
ABAP SQL 取日期+时间最新的一条数据
我们在系统对接的时候,外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的,那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案: 方式 1:SELECT MAX 可以通过两个 SELECT MAX 来取…...
【Rust自学】4.3. 所有权与函数
4.3.0 写在正文之前 在学习了Rust的通用编程概念后,就来到了整个Rust的重中之重——所有权,它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有三小节: 所有权࿱…...
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
一、什么是分布式锁 我们在上篇文章中实现了单机模式下的秒杀业务。其中采用了synchronized加锁来解决各种线程安全问题。而synchronized关键字是依赖于单机的JVM,在集群模式下,每个服务器都有独立的JVM,如果此时还采用synchronized关键字加…...
用docker快速安装电子白板Excalidraw绘制流程图
注:本文操作以debian12.8 最小化安装环境为host系统。 一、彻底卸载原有的残留 apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras 二、设置docker的安装源 # Add Dockers official G…...
使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动
使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动 Turtle库是Python标准库的一部分,它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”(Turtle)对象在屏幕上移动…...
人工智能入门是先看西瓜书还是先看花书?
在人工智能入门时,关于先看《机器学习》(西瓜书)还是先看《深度学习》(花书)的问题,实际上取决于个人的学习目标和背景。 《机器学习》(西瓜书)由周志华教授撰写,是一本…...
winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭
winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭 protected override void WndProc(ref Message m){#region 处理点击窗体标题栏放大缩小问题,禁用点击窗体标题栏放大缩小//logger.Info($&…...
进程内存转储工具|内存镜像提取-取证工具
1.内存转储,内存转储(Memory Dump)是将计算机的物理内存(RAM)内容复制到一个文件中的过程,这个文件通常被称为“内存转储文件”或“核心转储文件”(Core Dump),内存转储的主要目的是…...
数据结构day5:单向循环链表 代码作业
一、loopLink.h #ifndef __LOOPLINK_H__ #define __LOOPLINK_H__#include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {union{int len;DataType data;};struct node* next; }loopLink, *loopLinkPtr;//创建 loopLinkPtr create();//…...
(OCPP服务器)SteVe编译搭建全过程
注意:建议使用3.6.0,我升级到3.7.1,并没有多什么新功能,反而电表的实时数据只能看到累计电能了,我回退了就正常,数据库是兼容的,java版本换位java11,其他不变就好 背景:…...
OpenClaw多环境部署:GLM-4.7-Flash开发与生产配置
OpenClaw多环境部署:GLM-4.7-Flash开发与生产配置 1. 为什么需要区分开发与生产环境 去年我在尝试用OpenClaw自动化处理公司内部文档时,踩过一个典型的坑:直接在开发机上配置的生产环境参数,导致测试脚本误删了正式服务器上的文…...
CPO-RBF分类(优化宽度+中心值+连接权值)可用于故障检测等方向 基于冠豪猪优化算法优化径...
CPO-RBF分类(优化宽度中心值连接权值)可用于故障检测等方向 基于冠豪猪优化算法优化径向基神经网络的数据分类预测,Matlab代码,可直接运行,适合小白新手 程序已经调试好,无需更改代码替换数据集即可运行 需要更换其他算法的都可以…...
解锁AI创作自由:ComfyUI节点式工作流从入门到精通
解锁AI创作自由:ComfyUI节点式工作流从入门到精通 【免费下载链接】ComfyUI 最强大且模块化的具有图形/节点界面的稳定扩散GUI。 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI 你是否遇到过这样的困境:想要调整AI生成图像的某个细节…...
C语言开发环境哪家强?VSCode优势多,配置步骤快来看
当前存在多种C语言开发环境,其中最为专业的当属CLion,它能够运用各类AI辅助编程插件,然而无法免费使用,并且体积过于庞大。免费的像DevCpp等,体积较小,配置简便,只是无法接入AI辅助编程插件。VS…...
TrackWeight:将MacBook触控板转化为精准称重工具的创新解决方案
TrackWeight:将MacBook触控板转化为精准称重工具的创新解决方案 【免费下载链接】TrackWeight Use your Mac trackpad as a weighing scale 项目地址: https://gitcode.com/gh_mirrors/tr/TrackWeight TrackWeight是一款基于macOS平台的开源工具,…...
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全)
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全) 当服务器遭遇入侵时,大多数管理员的第一反应往往是查看历史命令记录。但现实情况是,黑客通常会第一时间清空.bash_history文件。这时,一个…...
从实战到原理:镜头畸变问题的深度解析与应对策略
1. 当镜头开始"说谎":工程师亲历的畸变异常事件 上周调试项目时遇到了一个诡异现象:用120度广角镜头拍摄的棋盘格图像,中间区域像被无形的手向内挤压,边缘却反常地向外膨胀。这既不是典型的桶形畸变(边缘向内…...
新手友好:通过快马生成带详解的nodepad项目轻松入门Web开发
作为一个刚接触Web开发的新手,想要自己动手实现一个简易的文本编辑器(nodepad)可能会觉得无从下手。最近我在InsCode(快马)平台上尝试了这个项目,发现整个过程比我预想的要简单很多,特别适合像我这样的初学者来理解Web开发的基本流程。 项目结…...
手把手教你用Ollama玩转translategemma-27b-it:图文翻译全攻略
手把手教你用Ollama玩转translategemma-27b-it:图文翻译全攻略 1. 认识translategemma-27b-it:你的专业翻译助手 1.1 什么是translategemma-27b-it translategemma-27b-it是Google基于Gemma 3架构开发的开源翻译模型,专为多语言图文翻译任…...
基于FPGA的智能车牌识别系统Verilog代码详解:含OV5640图像采集与HDMI显示功能...
基于FPGA的车牌识别系统verilog代码,包含verilog仿真代码,matlab仿真 OV5640采集图像,HDMI显示图像,车牌字符显示在车牌左上角,并且把车牌用红框框起。 正点原子达芬奇或者达芬奇pro都可以直接使用,fpga芯片…...
