当前位置: 首页 > news >正文

【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是一个接口&#xff0c;它继承Collection接口&#xff0c;Collection接口中的一些常用方法 List也有一些常用的方法。List是一个接口&#xff0c;它并不能直接实例化&#xff0c;ArrayList和LinkedList都实现了List接口&#xff0c;它们的常用方法都很相似。 Ar…...

HDR视频技术之十:MPEG 及 VCEG 的 HDR 编码优化

与传统标准动态范围&#xff08; SDR&#xff09;视频相比&#xff0c;高动态范围&#xff08; HDR&#xff09;视频由于比特深度的增加提供了更加丰富的亮区细节和暗区细节。最新的显示技术通过清晰地再现 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实验

一、概述 前情回顾&#xff1a;上次基于IPsec VPN的主模式进行了基础实验&#xff0c;但是很多高级特性没有涉及&#xff0c;如ike v2、不同传输模式、DPD检测、路由方式引入路由、野蛮模式等等&#xff0c;以后继续学习吧。 前面我们已经学习了GRE可以基于隧道口实现分支互联&…...

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架&#xff0c;适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统&#xff0c;支持用户注册、登录、发布文章等功能。 步骤&#xff1a; 安装 Flask 和其他必要库&#xff1a; 在开发博客之前&#xff0c;首…...

若依启动项目时配置为 HTTPS 协议

文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步&#xff1a;修改 vue.config.js 文件第二步&#xff1a;运行项目第三步&#xff1a;处理浏览器警告 6、运行结果 1、需求提出 在开发本地项目时&#xff0c;默认启动使用的是 HTTP 协议。但在某些测试…...

学习思考:一日三问(学习篇)之匹配VLAN

学习思考&#xff1a;一日三问&#xff08;学习篇&#xff09;之匹配VLAN 一、学了什么&#xff08;是什么&#xff09;1.1 理解LAN与"V"的LAN1.2 理解"V"的LAN怎么还原成LAN1.3 理解二层交换机眼中的"V"的LAN 二、为何会产生需求&#xff08;为…...

[WiFi] WiFi 802.1x介绍及EAP认证流程整理

802.1X Wi-Fi 802.1X 是一种网络访问控制协议&#xff0c;常用于保护无线网络。它提供了一种基于端口的网络访问控制机制&#xff0c;主要用于在用户和网络之间建立安全的连接。以下是 802.1X 的一些关键特点&#xff1a; 认证框架 802.1X 使用 EAP&#xff08;可扩展认证协议…...

用C#(.NET8)开发一个NTP(SNTP)服务

完整源码&#xff0c;附工程下载&#xff0c;工程其实也就下面两个代码。 想在不能上网的服务器局域网中部署一个时间服务NTP&#xff0c;当然系统自带该服务&#xff0c;可以开启&#xff0c;本文只是分享一下该协议报文和能跑的源码。网上作为服务的源码不太常见&#xff0c;…...

Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别

MyBatis 是一个用于简化数据库操作的框架&#xff0c;它可以帮助开发人员通过映射语句轻松执行 SQL 查询&#xff0c;并且能够方便地实现对象与数据库表之间的映射。MyBatis 支持一对一、一对多和多对多等关联查询。下面我们来探讨一下 MyBatis 如何实现一对一、一对多的关联查…...

ABAP SQL 取日期+时间最新的一条数据

我们在系统对接的时候&#xff0c;外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的&#xff0c;那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案&#xff1a; 方式 1&#xff1a;SELECT MAX 可以通过两个 SELECT MAX 来取…...

【Rust自学】4.3. 所有权与函数

4.3.0 写在正文之前 在学习了Rust的通用编程概念后&#xff0c;就来到了整个Rust的重中之重——所有权&#xff0c;它跟其他语言都不太一样&#xff0c;很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有三小节&#xff1a; 所有权&#xff1…...

【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)

一、什么是分布式锁 我们在上篇文章中实现了单机模式下的秒杀业务。其中采用了synchronized加锁来解决各种线程安全问题。而synchronized关键字是依赖于单机的JVM&#xff0c;在集群模式下&#xff0c;每个服务器都有独立的JVM&#xff0c;如果此时还采用synchronized关键字加…...

用docker快速安装电子白板Excalidraw绘制流程图

注&#xff1a;本文操作以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库实现&#xff0c;鼠标左键绘制路径&#xff0c;用鼠标右键结束绘制&#xff0c;小海龟并沿路径移动 Turtle库是Python标准库的一部分&#xff0c;它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”&#xff08;Turtle&#xff09;对象在屏幕上移动…...

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…...

winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭

winform中屏蔽双击最大化或最小化窗体(C#实现)&#xff0c;禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭 protected override void WndProc(ref Message m){#region 处理点击窗体标题栏放大缩小问题&#xff0c;禁用点击窗体标题栏放大缩小//logger.Info($&…...

进程内存转储工具|内存镜像提取-取证工具

1.内存转储&#xff0c;内存转储&#xff08;Memory Dump&#xff09;是将计算机的物理内存&#xff08;RAM&#xff09;内容复制到一个文件中的过程&#xff0c;这个文件通常被称为“内存转储文件”或“核心转储文件”&#xff08;Core Dump&#xff09;,内存转储的主要目的是…...

数据结构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编译搭建全过程

注意&#xff1a;建议使用3.6.0&#xff0c;我升级到3.7.1&#xff0c;并没有多什么新功能&#xff0c;反而电表的实时数据只能看到累计电能了&#xff0c;我回退了就正常&#xff0c;数据库是兼容的&#xff0c;java版本换位java11&#xff0c;其他不变就好 背景&#xff1a;…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...