ArrayList知识点详解

news/2024/9/23 13:33:17/

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?(如何创建?)

java">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()的原码:

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

 DEFAULTCAPACITY_EMPTY_ELEMENTDATA的原码:

java">private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

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

elementDate的原码:

java">transient Object[] elementData

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

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


ArrayList(int initialCapacity)

ArrayList(int initialCapacity) 原码: 

java">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原码:

java">private static final Object[] EMPTY_ELEMENTDATA = {};

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

937abc9141f647eebb92d2b50dcf0b32.png

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

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


 ArrayList(Collection <? extends E>c)  

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

java">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的无参构造可以添加数据

java">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)原码: 

java">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()原码: 

java">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)
java">
arrayList.remove(1);//删除1下标的12arrayList.remove(new Integer(12));//删除12
arrayList.remove(Integer.valueOf(12)));//删除12

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

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

java">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,[ )左闭右开

java">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) :用指定的元素(可选操作)替换此列表中指定位置的元素。

java">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、使用迭代器

java">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.ppmy.cn/news/1449055.html

相关文章

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 近些年&…

【机器学习】CLIP模型在有限计算资源下的性能探究:从数据、架构到训练策略

CLIP模型在有限计算资源下的性能探究&#xff1a;从数据、架构到训练策略 一、数据&#xff1a;质量胜过数量&#xff0c;小规模亦可制胜三、训练策略&#xff1a;选择合适的方法以应对计算资源的挑战 在人工智能领域&#xff0c;多模态模型正逐渐成为研究的热点。其中&#xf…

C#开发-nullable类型的比较

C#天然支持nullable类型。很多类除了可以有值以外&#xff0c;还可以为null。这时候我们就有疑问了&#xff0c;如果nullable类型的值为null&#xff0c;它和有值的比较结果是什么&#xff1f;它和同样为null的变量比较结果是什么&#xff1f;我现在就来解答。 测试环境是.NET…

Java:Thread类及常见方法大全(画图+源码详解)

Thread 类是 JVM 用来管理线程的一个类&#xff0c;每一个线程都有一个唯一的 Thread 类与之关联。Java中通常使用 Thread类来进行线程调度&#xff0c;线程管理。 目录 一、Thread 的常见构造方法 二、Thread 的几个常见属性 理解线程是否存活&#xff1a; 理解前台线程与…

C语言-单链表和双链表

C语言-单链表和双链表 单链表 // 定义单链表结点结构体 typedef struct Node {int data; // 数据域struct Node* next; // 指针域&#xff0c;指向下一个结点 } ListNode;// 创建新结点 ListNode* createNode(int data) {ListNode* newNode (ListNode*)malloc(sizeof(ListNo…

版本控制系统-Git

目录 1. Git简介 2. 下载及安装 3.命令行操做 3.1全局设置 3.2初始化仓库 3.3提交代码 3.4查看提交历史 3.5推送代码 3.6拉取合并代码 3.7克隆仓库 3.8. 配置忽略文件 3.9. 凭据管理 4. GUI工具操作 4.1. 全局设置 4.2. 初始化仓库 4.3. 提交代码 输入提交日志…

Golang Colly下载小红书详情页面图片小爬虫

语言:Golang 库:Iris/Colly 目前网上相关内容比较少,查了很久才找到解决方法。 期间曾尝试使用 selenium 解决,但需要搭建 selenium server,就没有再折腾了。 直到找到:https://juejin.cn/post/7230780828795584567 虽然不是Colly实现的,但起码提供了解决思路~~ 抱…