【数据结构】ArrayList详解

目录

前言

1. 线性表

2. 顺序表

3. ArrayList的介绍和使用

3.1 语法格式

3.2 添加元素

3.3 删除元素

3.4 截取部分arrayList

3.5 其他方法

4. ArrayList的遍历

5.ArrayList的扩容机制

6. ArrayList的优缺点

结语


前言

在集合框架中,ArrayList就是一个普通的类,它实现了List接口。作为我们学习初阶数据结构的入门知识,ArrayList还是很好理解的,在学习它之前,我们也得先来简单了解下线性表以及顺序表

1. 线性表

线性表(Linear List)是零个或多个相同类型数据元素的有限序列。它是一种被广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列……

线性表在逻辑上是线性结构,我们可以看作一条连续的直线,但是在物理结构上不一定是连续的,像顺序表,它在逻辑结构上和物理结构上都是连续的;而链表在物理结构上就不是连续的


2. 顺序表

从上面的图中我们可以看出,顺序表是物理结构和逻辑结构都连续的线性表,一般情况下采用数组存储,说白了,顺序表就是一个数组。ArrayList可以被认为是顺序表的一种实现


3. ArrayList的介绍和使用

3.1 语法格式

ArratList类位于java.util包当中,我们在使用前得先导包

import java.util.ArrayList;

ArrayList<E> arrayList = new ArrayList<>();

又因为ArrayList实现了List接口,所以我们也可以用接口来引用ArrayList对象,List类也需要导包

import java.util.List;
import java.util.ArrayList;

List<E> list = new ArrayList<>();
  • E:泛型数据类型,为可以用来限制arrayList的类型,但是只能引用数据类型
  • 对于两种arrayList的创建,我更推荐使用第一种,这样能实现的方法也会更多 

除了以上两种构造(无参),其实还有另外两种构造方法 

//指定顺序表的初始容量
ArrayList<E> arrayList = new ArrayList<>(int initialCapacity);

//利用其他Collection构建ArrayList
ArrayList<E> arrayList = new ArrayList<>(Collection<? extends E> c);

我们经常使用的就是第一、二种,第三种比较少用到


3.2 添加元素

boolean add(E e):在列表尾处插入e

void add(int index,E element):将element插入到下标为index位置

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        System.out.println(arrayList);
        arrayList.add(1,200);
        System.out.println(arrayList);

而且我们还可以直接打印list,因为它已经重写了toString方法。运行结果如下 

boolean addAll(Collection<? extends E> c):尾插一组数据(可以是其他顺序表)

        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);
        ArrayList<Integer> arrayList2 = new ArrayList<>(arrayList1);
        System.out.println(arrayList2);

运行结果如下 


3.3 删除元素

E remove(int index):删除下标为index的元素

boolean remove(Object o): 删除遇到的第一个o元素

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        System.out.println(arrayList);
        arrayList.remove(1);//删除下标为1的元素
        arrayList.remove(Integer.valueOf(2));//删除值为2的元素
        System.out.println(arrayList););

 运行结果如下 

注意:当我们想通过值来删除元素的时候,传进去的值要记得装箱,也就是将基本类型转为引用类型。像上面的例子,我们想要删除元素2,就得传入Integer.valueOf(2)才能实现


3.4 截取部分arrayList

List<E> subList(int fromIndex,int toIndex):截取部分list(左闭右开)

  • 要注意,该方法返回类型为List<E>,所以我们必须用List<E>去引用过arrayList对象
  • 该方法实际上不是生成一个新的顺序表,而是直接引用了arrayList里的地址,所以当我们改变list里的值时,arrayList里的值也会发生改变
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //截取部分list [左闭右开)
        List<Integer> list = arrayList.subList(0,2);
        System.out.println(list); //1,2
        //但是它并不是重新生成,而是指向同一引用
        list.set(0,100);
        System.out.println(arrayList);//arrayList里的元素也会被改变

运行结果如下

3.5 其他方法

有需要时就直接查询, 文档链接:ArrayList (Java SE 17 和 JDK 17) (oracle.com)


4. ArrayList的遍历

ArrayList有三种遍历方法:

  1. for循环
  2. foreach循环
  3. 使用迭代器
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //打印一:for
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i)+" ");
        }
        //打印二:foreach
        for (Integer x : arrayList) {
            System.out.print(x + " ");
        }
        System.out.println();

 运行结果如下


使用迭代器打印,我们就只能使用List<E>接口来引用arrayList,还有要导包

import java.util.Iterator; import java.util.ListIterator;

        //打印三:迭代器
        //默认是从 0 下标开始打印
        System.out.println("===Iterator===");
        Iterator<Integer> it =  arrayList.iterator();//创建迭代器
        while (it.hasNext()) {
            System.out.print(it.next() +" ");
        }
        System.out.println();

        System.out.println("===listIterator倒着打印===");
        //从 指定位置 开始打印     list1.size()
        ListIterator<Integer> it2 =  arrayList.listIterator(arrayList.size());
        while (it2.hasPrevious()) {
            System.out.print(it2.previous() +" ");
        }
        System.out.println();

运行结果如下

这个方法适当了解就行 


5.ArrayList的扩容机制

在前面的学习中,我们使用到了add()方法来添加元素,但我们在创建顺序表的时候却没有给它指定容量大小,它的大小肯定为0,那为什么还能正常添加而不报错呢?

其实ArrayList它是一个动态类型的顺序表,我们在插入元素的过程中,它会自动扩容,因此不需要我们担心容量太小而不够添加元素

6. ArrayList的优缺点

优点:因为ArrayList是一个顺序表,非常适合根据下标查找和更新的场景,此时的时间复杂度为O(1)

缺点:也正是因为ArrayList是一个顺序表,因此当我们想在任意位置插入或删除元素时,往往需要将后面一堆的元素进行移动,时间复杂度为O(n);再则,当我们想要存放数据是,它的扩容机制是为1.5倍或2倍扩容,这样可能会导致内存空间的浪费

结语

今天我们一起学习了ArrayList,知道了它的构造,使用方法,优缺点……而想要解决ArrayList的痛点,我们可以使用链表来规避这些问题,这就是我们下篇博文要写的内容,敬请期待吧

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

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

相关文章

【Linux】环境基础开发工具使用——vim使用

Linux 软件包管理器 yum 什么是软件包 1.在 Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 2.但是这样太麻烦了 , 于是有些人把一些常用的软件提前编译好 , 做成软件包 ( 可以理解成 windows 上的安装程序) 放在一个服务器…

C#,简单,精巧,实用的文件夹时间整理工具FolderTime

点击下载本文软件&#xff08;5积分&#xff09;&#xff1a; https://download.csdn.net/download/beijinghorn/89071073https://download.csdn.net/download/beijinghorn/89071073 百度网盘&#xff08;不需积分&#xff09;&#xff1a; https://pan.baidu.com/s/1FwCsSz…

ThreadLocal上传下载文件

文章目录 ThreadLocal1.基本介绍1.什么是ThreadLocal&#xff1f;2.示意图 2.快速入门1.创建普通java项目2.编写代码1.T1.java2.T1Service.java3.T2Dao.java4.Dog.java 3.结果 3.ThreadLocal源码解读1.set方法2.set方法总结3.get方法 上传下载文件1.基本介绍1.基本说明2.文件上…

Spring Cloud介绍

一、SpringCloud总体概述 Cloud Foundry Service Broker&#xff1a;通用service集成进入Cloud Foundry Cluster&#xff1a;服务集群 Consul&#xff1a;注册中心 Security&#xff1a;安全认证 Stream&#xff1a;消息队列 Stream App Starters&#xff1a;Spring Cloud Stre…

Redis 客户端

Redis 客户端 客户端-服务器结构 Redis 同 Mysql 一样&#xff0c;也是一个客户端-服务器结构的程序&#xff0c;结构如下图&#xff1a; 注&#xff1a;Redis 客户端和服务器可以在同一个主机上&#xff0c;也可以在不同主机上 Redis 客户端的多种形态 自带的命令行客户端&…

【Qt 学习笔记】详解Qt中的信号和槽

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 详解Qt中的信号与槽 文章编号&#xff1a;Qt 学习笔记 / 12 文章目录…

【Node.js】短链接

原文链接&#xff1a;Nodejs 第六十二章&#xff08;短链接&#xff09; - 掘金 (juejin.cn) 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些平台对字符数量有限制&#xff0c;长网址可…

旋转花键有哪些优缺点?

旋转花键是在花键外筒的外径上装上专用的轴承外套&#xff0c;使之运转动作&#xff0c;适用于水平多关节机械手臂&#xff08;SCARA&#xff09;、产业用机器人、自动装载机、镭射加工机、搬送装置、机械加工中心的ATC装置等各项设备。 目前&#xff0c;旋转花键的应用越来越普…

redis 哨兵

文章目录 前言主从复制的问题怎么人工恢复故障主节点 Redis Setinel 架构使用 docker 来配置哨兵结构安装 docker编排 redis 主从节点编排 redis 哨兵节点 观察哨兵模式的作用主从切换的具体流程小结 前言 redis 主从复制模式下, 一旦主节点出现故障, 不能提供服务的时候, 就需…

刷题之Leetcode283题(超级详细)

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nu…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1&#xff1a;迭代器模型【Iterator Model】 方法2&#xff1a;物化模型【Materialization Model】 方…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程&#xff0c;使用java.lang.Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;因此把run()方法体称为线程执行体。…

数据结构之堆底层实现的循序渐进

题外话 把没写的都补回来! 正题 堆 概念 堆是一棵完全二叉树&#xff0c;因此可以层序的规则采用顺序的方式来高效存储&#xff0c; 大根堆:指根结点比左右孩子都大的堆 小根堆:指根结点比左右孩子都小的堆 性质 1.堆中某个节点的值总是不大于或不小于其父节点的值 2…

CCIE-14-MPLS_and_BGP

目录 实验条件网络拓朴 环境配置开始配置配置MPLSR1访问R6检测结果R6访问R1检测结果 实验条件 网络拓朴 环境配置 在我的资源里可以下载&#xff08;就在这篇文章的开头也可以下载&#xff09; 开始配置 R1<->R2&#xff1a;EBGP R2<->R5&#xff1a;IBGP&…

蓝桥杯备考3

P8196 [传智杯 #4 决赛] 三元组 题目描述 给定一个长度为 n 的数列 a&#xff0c;对于一个有序整数三元组 (i,j,k)&#xff0c;若其满足 1≤i≤j≤k≤n 并且&#xff0c;则我们称这个三元组是「传智的」。 现在请你计算&#xff0c;有多少有序整数三元组是传智的。 输入格式…

小米手机澎湃OS,不Root查看电池健康

首先&#xff0c;在键盘拨号界面&#xff0c;输入*#*#284#*#*&#xff0c;会调用问题反馈APP来生成当前系统的故障日志&#xff0c;如果提示你需要授权什么就点确认 稍等几分钟&#xff0c;会得到一个压缩包&#xff0c;保存在目录MIUI/debug_log下 这里为了方便&#xff0c;我…

肖恩带你学C语言·文件操作(上)

1. 为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保存&…

打造自然资源“一张图”管理平台,推动生态文明建设新篇章

在信息化时代的浪潮下&#xff0c;自然资源管理正面临着前所未有的挑战与机遇。传统的资源管理模式已经难以满足当前生态环境保护与经济发展的双重需求&#xff0c;我们需要一个全新的平台&#xff0c;一个集信息集成、智能分析、决策支持于一体的自然资源“一张图”管理平台。…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

c语言结构体变量和结构体数组的练习(自用版)

结构体变量注释和结构体数组练习&#xff08;已注释&#xff09;代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> struct Student {char name[20];int age;char sex;float score;char addr[30]; };int main() {//练习结构体变量struct Student s…