ArrayList知识点详解

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下标的12arrayList.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.mzph.cn/bicheng/5637.shtml

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

相关文章

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

c#数据库: 11.分组统计学生信息/ 12.视图查询

该例以学生信息表为例&#xff0c;将学生信息按年级和性别分组&#xff0c;统计各年级男生和女生的人数、总成绩和平均成绩&#xff0c;并将查询结果按平均成绩降序排列。下图是原数据表staq: 【C#实现过程】 &#xff08;1&#xff09;创建一个名为StudentGroup的窗体应用程序…

RK3588S和ARM阵列服务器在虚拟化云平台的应用

RK3588是瑞芯微2021年底推出的首款高端8nm旗舰芯片&#xff0c;而RK3588S 则是针对消费端市场在RK3588基础上缩减了部分外围接口&#xff0c;CPU、GPU和NPU等主要参数得到了保留&#xff0c;主要应用范围为高端ARM平板、ARM笔电产品&#xff0c;会议平板类、ARM服务器、智能机器…

如何批量删除多个不同路径的文件但又保留文件夹呢

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、我准备了三个文件夹&#xff08;实际操作的时候可能是上百个文件夹&#xff0c;无所谓&#xff09;&#xff0c;里面都放了两个图片 2、然后打开工具&am…

【Gateway】网关集成Knife4j—swagger接口文档

文章目录 前言一、相关配置1.网关gateway配置①.网关增加配置 pom文件②.网关增加配置 SwaggerHandler③.网关增加配置 SwaggerResourceConfig④.网关增加配置 SwaggerConfig 2.网关过滤器 二、接口文档使用1.访问文档2.查看文档 总结 前言 在日常开发中是需要前后端联调的&am…

09_Scala函数和对象

文章目录 函数和对象1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象2.将函数当作对象来用&#xff0c;也就是访问函数&#xff0c;但是不执行函数结果3.对象拥有数据类型(函数类型)&#xff0c;对象可以进行赋值操作4.函数对象类型的省略写法&#xff0c;也就是…

变电站综合自动化系统:Modbus-PLC-645转IEC104网关方案

前言 电力行业作为关系国计民生的重要基础产业&#xff0c;是关系千家万户的公用事业。但是要做好电力行业安全保障工作的前提&#xff0c;是需要对应的技术人员详细了解电力工业使用的系统、设备以及各类协议的安全特性&#xff0c;本文将主要介绍IEC 104协议的定义和钡铼技术…

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

C++——STL容器——vector

vector是STL容器的一种&#xff0c;和我们在数据结构中所学的顺序表结构相似&#xff0c;其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组&#xff0c;支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器&#xff0c;应该…

安全再升级,亚信安慧AntDB数据库与亚信安全二次牵手完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;的产品与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;简称&#xff1a;亚信安全&#xff09;再次携手&#xff0c;完成亚信安慧AntDB数据库与亚信安全IPoE接入认证系统…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX&#xff08;System Package Data Exchange&#xff09;格式是一种用于描述软件组件&#xff08;如源代码&#xff09;的规范&#xff0c;它提供了一种标准化的方法来描述软件组件的元数据&#xff0c;包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

复旦微JFM7VX690计算后IO接口模块,用于雷达信号处理、数据处理等需要高速密集计算的应用场景

计算后IO接口模块 1 介绍 1.1 产品概述 计算后IO接口模块主要由复旦微JFM7VX690型FPGA、国产以太网收发器YT8521、国产BMC芯片GD32F450、国产CPLD芯片EF2L45BG256B、国产内存颗粒等主要芯片组成&#xff0c;采用标准6U VPX尺寸设计。 本计算后IO接口模块主要用于雷达信号处…

Java面试八股之Java中数组有没有length()方法?String呢?为什么?

Java中数组有没有length()方法&#xff1f;String呢&#xff1f;为什么&#xff1f; 数组&#xff1a; 数组没有名为length()的方法&#xff0c;但有一个属性叫做length。可以通过数组名直接访问这个属性来获取数组的长度&#xff08;即元素个数&#xff09;。这是一个整数值&…

【redis】Redis数据类型(三)List类型

目录 List类型介绍特点 List数据结构附&#xff1a;3.2以前的版本(介绍一下压缩列表和双向链表)压缩列表ZipList双向链表LinkedList 常用命令lpush示例 lpushx示例 rpush示例 rpushx示例 LPOP示例 RPOP示例 BLPOP非阻塞行为阻塞行为相同的 key 被多个客户端同时阻塞在 MULTI/EX…

[笔试强训day06]

文章目录 NC10 大数乘法NC1 大数加法NC40 链表相加(二) NC10 大数乘法 NC10 大数乘法 #include <string> #include <vector> class Solution {public:string solve(string s, string t) {int m s.size(), n t.size();reverse(s.begin(), s.end());reverse(t.beg…

Matlab图像处理——基于BP神经网络的车牌标识识别系统

1. 数据集介绍 中国交通标志数据集&#xff1a; https://nlpr.ia.ac.cn/pal/trafficdata/detection.html 该数据集包含58类交通标志。 2. 数据处理 按照文件标签&#xff0c;将数据集划分了58类&#xff0c;如下&#xff1a; 对应的类别信息记录如下&#xff1a; 限速5km/…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒处理建议

在网络技术不断发展的时代&#xff0c;网络在企业中的应用广泛&#xff0c;可以为企业带来更多的便利&#xff0c;大大提升了企业的生产效率&#xff0c;但网络作为虚拟世界&#xff0c;在为企业提供便利的同时&#xff0c;也为企业数据安全带来严重威胁。近期&#xff0c;云天…

【YOLO改进】换遍IoU损失函数之EIoU Loss(基于MMYOLO)

EIoU损失函数 设计原理 一、IoU的局限性 IoU&#xff08;Intersection over Union&#xff09;是一种常用于评估目标检测模型性能的指标&#xff0c;特别是在计算预测边界框与真实边界框之间的重叠程度时。然而&#xff0c;IoU存在一些局限性&#xff0c;尤其是当两个边界框…

[python趣味实战]----基于python代码实现浪漫爱心 დ

正文 01-效果演示 下图是代码运行之后的爱心显示结果&#xff1a; 下面的视频该爱心是动态效果&#xff0c;较为简洁&#xff0c;如果需要使用&#xff0c;可以进行完善&#xff0c;这里只是一个趣味实战&#xff0c;下面将对代码实现进行非常详细地描述&#xff1a; 浪漫爱心…