ArrayList知识点详解

news2024/11/17 7:31:15

f58f8e3a94e643cea1dfc581478ba6fc.png

目录

1.简介

2.ArrayList的使用

(1)如何实例化ArrayList?(如何创建?)

(2)如何构造使用?

(3)为什么ArrayList的无参构造可以添加数据

(4)ArrayList常见操作 

(5)ArrayList如何遍历

(6)ArrayList的扩容机制

 


 

 

1.简介

ArrayList背后是一个顺序表,顺序表底层是一个数组

04fbbe0063724657a153e34d0e66d23f.png

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问 
  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

2.ArrayList的使用

(1)如何实例化ArrayList?(如何创建?)

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

public class Test {
    ArrayList<Integer> arrayList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
}

有两种方法,区别:list当中的方法相比arraylist较少

d315a40192794d0abaee9924b22ca77d.png

(2)如何构造使用?

2105c9180d944649aa079a677d9dca58.png

Array() 

无参ArrayList()的原码:

public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

 DEFAULTCAPACITY_EMPTY_ELEMENTDATA的原码:

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

说明:常量数组,长度为0 

elementDate的原码:

transient Object[] elementData

说明:element在此处只是一个数组引用,没有进行内存分配 

总结:ArrayList的无参构造方法,并没有给数组分配大小,数组长度为0


ArrayList(int initialCapacity)

ArrayList(int initialCapacity) 原码: 

public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

 说明:传入的值为几,该方法就会给你分配多大的空间

EMPTY_ELEMENTDATA原码:

private static final Object[] EMPTY_ELEMENTDATA = {};

说明:如果传入的值为0时,就会创建一个空数组 

937abc9141f647eebb92d2b50dcf0b32.png

说明:当传入负数时就会抛出异常 

总结:传入的值就是分配给数组的空间,值为0就是空数组,值为负数则抛出异常


 ArrayList(Collection <? extends E>c)  

ArrayList(Collection <? extends E>c)  原码:

public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }

说明: 

?是E或E 的子类    实现了Collection接口 满足这两种情况即可进行传递

此处arraylist的泛型类型是arraylist3泛型类型的本身,且实现了Collection接口所以可以进行传递

f4a840b7f5d34d67a4eac146302ca965.png

 总结:?是E或E 的子类    实现了Collection接口 满足这两种情况即可进行传递

 (3)为什么ArrayList的无参构造可以添加数据

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);

 add(E e)原码:

d91120a7325a4b46a5df200da632fad4.png

 

说明:把10传进去。此时e为10 ,size为0,elementDate是一个空数组

add(E e, Object[] elementData, int s)原码: 

private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }

 说明:传入的e为10,空数组,s为0;s==0再调用grow()

grow()原码: 

private Object[] grow() {
        return grow(size + 1);
    }

 grow(size + 1)原码:

10d8513adee54c2492d065a0535dbfc0.png

说明:oldCapaticity为0不进入if语句,直接执行else语句,此处返回的是大小为10的数组 

当我们出现执行if语句的情况时,会将原数组空间扩容为原来的1.5倍

总结:当调用不带参数的构造方法进行add的时候,第一次add会分配大小为10的内存 

(4)ArrayList常见操作 

66a678d3c8c04a02bdba38d6e28cb869.png

 

remove :删除元素

有两种操作形式:

  1. 输入下标删除对应下标的值  E remove(int index)
  2. 输入对象直接删除值   boolean remove (Object o)

arrayList.remove(1);//删除1下标的12

arrayList.remove(new Integer(12));//删除12
arrayList.remove(Integer.valueOf(12)));//删除12

addAll(Collection<? extends E> c) :一组数据一次性添加,尾插 c 中的元素

                 ?是E或E 的子类    实现了Collection接口 满足这两种情况即可进行传递

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(12);
ArrayList<Integer> arrayList1 = new ArrayList<>();
arrayList1.addAll(arrayList);
System.out.println(arrayList1);

 3e1e6b595ad54dd3b46b7dfad2a859f6.png

 


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

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(12);
arrayList.add(23);
arrayList.add(34);
List<Integer> list = arrayList.subList(1,3);
System.out.println(list);

 5daa392350aa4b3fb4a7f443499a9398.png

该方法是在arraylist的基础上截取的,并没有生成新的对象。

dbca6a59232c4c46928db5c9c7702abd.png


E set(int index, Eelement) :用指定的元素(可选操作)替换此列表中指定位置的元素。

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(12);
arrayList.add(23);
arrayList.add(34);
List<Integer> list = arrayList.subList(1,3);
arrayList.set(1,99);//1下标更新为99
System.out.println(list);
System.out.println(arrayList);

 e710fe5b0b3b453eb324a2597e6267b1.png

(5)ArrayList如何遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器

public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(10);
        arrayList.add(12);
        arrayList.add(23);
        arrayList.add(34);
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i) + " ");
        }
        System.out.println();
        for (Integer integer:arrayList) {
            System.out.print(integer + " ");
        }
        System.out.println();
        Iterator<Integer> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
    }

156914c2c4844f899285f1ef074d5e55.png

(6)ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。 

此处跟上面无参构造添加数据的情况基本一致,只不过最后执行的是if语句:

1d5cba06883c4109a5f3b07f027704f0.png

总结:

  1. 检测是否真正需要扩容,如果是调用grow准备扩容  
  2. 预估需要库容的大小 
    初步预估按照1.5倍大小扩容
    如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
    真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
  3. 使用copyOf进行扩容

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【进收藏夹吃灰系列】算法学习指南

文章目录 [toc]分治算法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;进收藏夹吃灰系列 分治算法 博客标题博客url【分治算法】【Python实现】Hanoi塔问题https://blog.csdn.net/from__2024_04_11/article/details/138093461?spm1001.2014.3001.5502

Flowable入门案例

资料地址1614912120/Flowable (github.com)https://github.com/1614912120/Flowable 步骤1&#xff1a;添加Flowable依赖 首先&#xff0c;您需要将Flowable引擎集成到您的项目中。您可以通过Maven、Gradle或手动下载jar包的方式来添加Flowable的依赖。 <?xml version&q…

CVPR 小样本土地覆盖制图 张洪艳教授团队获挑战赛冠军

提出了一个广义的基于少镜头分割的框架&#xff0c;以更新高分辨率土地覆盖制图中的新类&#xff0c;分为三个部分:(a)数据预处理:对基础训练集和新类的少镜头支持集进行分析和扩充;(b)混合分割结构:将多基学习器和改进的投影到正交原型(POP)网络相结合&#xff0c;增强基类识别…

公共 IP 地址与私有 IP 地址区别有哪些?

​  IP 地址是分配给互联网上每个设备的唯一数字 ID。 IP 地址可以在 Internet 上公开使用&#xff0c;也可以在局域网 (LAN)上私有使用。本文&#xff0c;我们主要探讨公共 IP 地址和私有 IP 地址之间的区别。 公共IP地址&#xff1a;公共IP地址是用于访问Internet的向外的I…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

结构体反汇编解析

代码如下 #include<iostream> using namespace std; typedef struct Role {int HP;int MP; }*PRole; int main() {Role user;PRole puser;puser &user;puser->HP 1500;puser->MP 2000;user.HP 2500;user.MP 3000;return 0; }基础知识 如果是地址就是采用…

关于Centos 7/8 网络设置 与工具连接

网络三步曲的配置 1、首先更改虚拟机的网络配置 查看子网地址以及网关 如果有要求需要更改IP地址&#xff0c;规定第三位是指定数值&#xff0c;那么需要全部更改 例如&#xff0c;IP地址为192.168.200.30 其中200为重点&#xff0c;更改时为以下步骤 1、点击DHCP设置&#x…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

云计算技术概述_1.云计算相关概念

1.关于IBM“蓝云&#xff08;Blue Cloud&#xff09;”计划 IBM 推出的“蓝云&#xff08;Blue Cloud&#xff09;”计划为客户带来即可使用的云计算(Cloud Computing)。它包括一系列的云计算产品&#xff0c;使计算不仅仅局限在本地机器或远程Server Farms&#…

GPT3 终极指南(一)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 GPT-3&#xff0c;或者说是 Generative Pre-trained Transformer 3&#xff0c;是由 OpenAI 开发的基于 Transformer 的大型语言模型…

【R语言数据分析】数据类型与数据结构

R的数据类型有数值型num&#xff0c;字符型chr&#xff0c;逻辑型logi等等。 R最常处理的数据结构是&#xff1a;向量&#xff0c;数据框&#xff0c;矩阵&#xff0c;列表。 向量有数值型向量&#xff0c;字符型向量&#xff0c;逻辑型向量等&#xff0c;字符型向量就是反应…

书生·浦语 大模型(学习笔记-9)OpenCompass 大模型评测实战

目录 一、评测实现双赢 二、评测遇到的问题 三、如何评测大模型&#xff08;大概总结4大类方法&#xff09; 四、评测工具链及流水线 五、实战评测 GPU的环境安装 查看支持的数据集和模型 启动评测(会缺少protibuf库&#xff0c;提前安装&#xff09; 测评结果 一、评…

【linux学习指南】linux 环境搭建

文章目录 &#x1f4dd;前言&#x1f320; 云服务器的选择&#x1f320;阿里云&#x1f320;腾讯云&#x1f320;华为云 &#x1f320;使用 XShell 远程登陆到 Linux&#x1f309;下载 XShell &#x1f320;查看 Linux 主机 ip&#x1f309; XShell 下的复制粘贴&#x1f309; …

Linux下安装snaphu

1、官网下载安装包 2、解压&#xff0c;移动文件夹到/usr/local/下 3、在/usr/local/下创建man&#xff0c;在man下创建man1文件夹 4、进入到snaphu的src文件夹里&#xff0c;执行sudo make&#xff0c;如果报错 在这个 Makefile 中&#xff0c;-arch x86_64 是 macOS 特定的…

ai口语软件有合适的吗?分享4款!

在全球化日益深入的今天&#xff0c;英语作为国际通用语言&#xff0c;其重要性不言而喻。然而&#xff0c;传统的英语学习方式往往枯燥无味&#xff0c;难以持续。幸运的是&#xff0c;随着人工智能技术的快速发展&#xff0c;AI英语口语软件应运而生&#xff0c;为语言学习者…

PHP算命源码_最新测算塔罗源码_可以运营

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

区块链论文总结速读--CCF B会议 ICDCS 2023 共8篇

Conference&#xff1a;IEEE 43rd International Conference on Distributed Computing Systems (ICDCS) CCF level&#xff1a;CCF B Categories&#xff1a;Computer Architecture/Parallel and Distributed Computing/Storage Systems 计算机体系结构/并行与分布计算/存储…

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

全国产化BMC子卡详细介绍

一款基于全国产的BMC子卡&#xff0c;可实现ChMC/IPMC功能。子卡遵循IPMI 1.5/2.0协议规范&#xff0c;也支持客制OEM命令。子卡可获取载板板卡环境信息&#xff0c;板卡属性信息和板卡状态信息等&#xff0c;其中包括温度、电压、电流等信息&#xff1b;FRU、系统版本、CPU型号…

Kubernetes 弃用Docker后 Kubelet切换到Containerd

containerd 是一个高级容器运行时&#xff0c;又名 容器管理器。简单来说&#xff0c;它是一个守护进程&#xff0c;在单个主机上管理完整的容器生命周期&#xff1a;创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。 containerd 旨在轻松嵌入到更大的系统中。Docke…