ArrayList 介绍

ArrayList 简单介绍 大家好,我是IT修真院北京分院第27期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务10,深度思考中的知识点———ArrayList 简单介绍   1.背景介绍 概括的说,ArrayList 是一个动态数组,它是线程不安全的,允许元素为null。  其底层数据结构依然是数组,它实现了List<E>, RandomAccess, C... 阅读详情

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【ArrayList 简单介绍】

大家好,我是IT修真院北京分院第27期的JAVA学员,一枚正直纯洁善良的java程序员。

今天给大家分享一下,修真院官网Java任务10,深度思考中的知识点———ArrayList 简单介绍

1.背景介绍

概括的说,ArrayList 是一个动态数组,它是线程不安全的,允许元素为null。
其底层数据结构依然是数组,它实现了List, RandomAccess, Cloneable, java.io.Serializable接口,其中RandomAccess代表了其拥有随机快速访问的能力,ArrayList可以以O(1)的时间复杂度去根据下标访问元素。

因其底层数据结构是数组,所以可想而知,它是占据一块连续的内存空间(容量就是数组的length),所以它也有数组的缺点,空间效率不高。

由于数组的内存连续,可以根据下标以O1的时间读写(改查)元素,因此时间效率很高。

当集合中的元素超出这个容量,便会进行扩容操作。扩容操作也是ArrayList 的一个性能消耗比较大的地方,所以若我们可以提前预知数据的规模,应该通过public ArrayList(int initialCapacity) {}构造方法,指定集合的大小,去构建ArrayList实例,以减少扩容次数,提高效率。

或者在需要扩容的时候,手动调用public void ensureCapacity(int minCapacity) {}方法扩容。
不过该方法是ArrayList的API,不是List接口里的,所以使用时需要强转:
((ArrayList)list).ensureCapacity(30);

当每次修改结构时,增加导致扩容,或者删,都会修改modCount。

2.知识剖析

构造方法
//默认构造函数里的空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//存储集合元素的底层实现:真正存放元素的数组
transient Object[] elementData; // non-private to simplify nested class access
//当前元素数量
private int size;

//默认构造方法
public ArrayList() {
    //默认构造方法只是简单的将 空数组赋值给了elementData
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

//空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//带初始容量的构造方法
public ArrayList(int initialCapacity) {
    //如果初始容量大于0,则新建一个长度为initialCapacity的Object数组.
    //注意这里并没有修改size(对比第三个构造函数)
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {//如果容量为0,直接将EMPTY_ELEMENTDATA赋值给elementData
        this.elementData = EMPTY_ELEMENTDATA;
    } else {//容量小于0,直接抛出异常
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

//利用别的集合类来构建ArrayList的构造函数
public ArrayList(Collection<? extends E> c) {
    //直接利用Collection.toArray()方法得到一个对象数组,并赋值给elementData 
    elementData = c.toArray();
    //因为size代表的是集合元素数量,所以通过别的集合来构造ArrayList时,要给size赋值
    if ((size = elementData.length) != 0) {
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)//这里是当c.toArray出错,没有返回Object[]时,利用Arrays.copyOf 来复制集合c中的元素到elementData数组中
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        //如果集合c元素数量为0,则将空数组EMPTY_ELEMENTDATA赋值给elementData 
        // replace with empty array.
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

小结一下,构造函数走完之后,会构建出数组elementData和数量size。

这里大家要注意一下Collection.toArray()这个方法,在Collection子类各大集合的源码中,高频使用了这个方法去获得某Collection的所有元素。

关于方法:Arrays.copyOf(elementData, size, Object[].class),就是根据class的类型来决定是new 还是反射去构造一个泛型数组,同时利用native函数,批量赋值元素至新数组中。
如下:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    @SuppressWarnings("unchecked")
    //根据class的类型来决定是new 还是反射去构造一个泛型数组
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    //利用native函数,批量赋值元素至新数组中。
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

值得注意的是,System.arraycopy也是一个很高频的函数,大家要留意一下。

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

常用API
1 增
每次 add之前,都会判断add后的容量,是否需要扩容。

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;//在数组末尾追加一个元素,并修改size
return true;
}
private static final int DEFAULT_CAPACITY = 10;//默认扩容容量 10
private void ensureCapacityInternal(int minCapacity) {
//利用 == 可以判断数组是否是用默认构造函数初始化的
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}

    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
modCount++;//如果确定要扩容,会修改modCount

// overflow-conscious code
if (minCapacity - elementData.length > 0)
    grow(minCapacity);

}

//需要扩容的话,默认扩容一半
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//默认扩容一半
if (newCapacity - minCapacity < 0)//如果还不够 ,那么就用 能容纳的最小的数量。(add后的容量)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//拷贝,扩容,构建一个新数组,
}

public void add(int index, E element) {
rangeCheckForAdd(index);//越界判断 如果越界抛异常

ensureCapacityInternal(size + 1);  // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
                 size - index); //将index开始的数据 向后移动一位
elementData[index] = element;
size++;

}
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount //确认是否需要扩容
System.arraycopy(a, 0, elementData, size, numNew);// 复制数组完成复制
size += numNew;
return numNew != 0;
}
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);//越界判断

Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew);  // Increments modCount //确认是否需要扩容

int numMoved = size - index;
if (numMoved > 0)
    System.arraycopy(elementData, index, elementData, index + numNew,
                     numMoved);//移动(复制)数组

System.arraycopy(a, 0, elementData, index, numNew);//复制数组完成批量赋值
size += numNew;
return numNew != 0;

}
总结:
add、addAll。
先判断是否越界,是否需要扩容。
如果扩容, 就复制数组。
然后设置对应下标元素值。

值得注意的是:
1 如果需要扩容的话,默认扩容一半。如果扩容一半不够,就用目标的size作为扩容后的容量。
2 在扩容成功后,会修改modCount

2 删
public E remove(int index) {
rangeCheck(index);//判断是否越界
modCount++;//修改modeCount 因为结构改变了
E oldValue = elementData(index);//读出要删除的值
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);//用复制 覆盖数组数据
elementData[–size] = null; // clear to let GC do its work //置空原尾部数据 不再强引用, 可以GC掉
return oldValue;
}
//根据下标从数组取值 并强转
E elementData(int index) {
return (E) elementData[index];
}

//删除该元素在数组中第一次出现的位置上的数据。 如果有该元素返回true,如果false。
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);//根据index删除元素
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
//不会越界 不用判断 ,也不需要取出该元素。
private void fastRemove(int index) {
modCount++;//修改modCount
int numMoved = size - index - 1;//计算要移动的元素数量
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);//以复制覆盖元素 完成删除
elementData[–size] = null; // clear to let GC do its work //置空 不再强引用
}

//批量删除
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull©;//判空
return batchRemove(c, false);
}
//批量移动
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;//w 代表批量删除后 数组还剩多少元素
boolean modified = false;
try {
//高效的保存两个集合公有元素的算法
for (; r < size; r++)
if (c.contains(elementData[r]) == complement) // 如果 c里不包含当前下标元素,
elementData[w++] = elementData[r];//则保留
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) { //出现异常会导致 r !=size , 则将出现异常处后面的数据全部复制覆盖到数组里。
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;//修改 w数量
}
if (w != size) {//置空数组后面的元素
// clear to let GC do its work
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;//修改modCount
size = w;// 修改size
modified = true;
}
}
return modified;
}
从这里我们也可以看出,当用来作为删除元素的集合里的元素多余被删除集合时,也没事,只会删除它们共同拥有的元素。

小结:
1 删除操作一定会修改modCount,且可能涉及到数组的复制,相对低效。
2 批量删除中,涉及高效的保存两个集合公有元素的算法,可以留意一下。

3 改
不会修改modCount,相对增删是高效的操作。

public E set(int index, E element) {
rangeCheck(index);//越界检查
E oldValue = elementData(index); //取出元素
elementData[index] = element;//覆盖元素
return oldValue;//返回元素
}
4 查
不会修改modCount,相对增删是高效的操作。

public E get(int index) {
rangeCheck(index);//越界检查
return elementData(index); //下标取数据
}
E elementData(int index) {
return (E) elementData[index];
}
5 清空,clear
会修改modCount。

public void clear() {
modCount++;//修改modCount
// clear to let GC do its work
for (int i = 0; i < size; i++) //将所有元素置null
elementData[i] = null;

size = 0; //修改size 

}
6 包含 contain
//普通的for循环寻找值,只不过会根据目标对象是否为null分别循环查找。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
//普通的for循环寻找值,只不过会根据目标对象是否为null分别循环查找。
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
7 判空 isEmpty()
public boolean isEmpty() {
return size == 0;
}
8 迭代器 Iterator.
public Iterator iterator() {
return new Itr();
}
/**

  • An optimized version of AbstractList.Itr
    */
    private class Itr implements Iterator {
    int cursor; // index of next element to return //默认是0
    int lastRet = -1; // index of last element returned; -1 if no such //上一次返回的元素 (删除的标志位)
    int expectedModCount = modCount; //用于判断集合是否修改过结构的 标志

    public boolean hasNext() {
    return cursor != size;//游标是否移动至尾部
    }

    @SuppressWarnings(“unchecked”)
    public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)//判断是否越界
    throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)//再次判断是否越界,在 我们这里的操作时,有异步线程修改了List
    throw new ConcurrentModificationException();
    cursor = i + 1;//游标+1
    return (E) elementData[lastRet = i];//返回元素 ,并设置上一次返回的元素的下标
    }

    public void remove() {//remove 掉 上一次next的元素
    if (lastRet < 0)//先判断是否next过
    throw new IllegalStateException();
    checkForComodification();//判断是否修改过

     try {
         ArrayList.this.remove(lastRet);//删除元素 remove方法内会修改 modCount 所以后面要更新Iterator里的这个标志值
         cursor = lastRet; //要删除的游标
         lastRet = -1; //不能重复删除 所以修改删除的标志位
         expectedModCount = modCount;//更新 判断集合是否修改的标志,
     } catch (IndexOutOfBoundsException ex) {
         throw new ConcurrentModificationException();
     }
    

    }
    //判断是否修改过了List的结构,如果有修改,抛出异常
    final void checkForComodification() {
    if (modCount != expectedModCount)
    throw new ConcurrentModificationException();
    }
    }

3.常见问题

Vector底层也是数组,与ArrayList最大的区别就是:同步(线程安全) Vector是同步的,我们可以从方法上就可以看得出来

如果非要实现同步呢?

4.解决方案

在要求非同步的情况下,我们一般都是使用ArrayList来替代Vector的了~ 如果想要ArrayList实现同步,可以使用Collections的方法:List list = Collections.synchronizedList(new ArrayList(…));,就可以实现同步了~ ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍

5.编码实战

详见视频

6.扩展思考

ARRAYLIST集合加入1万条数据,应该怎么提高效率

ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。 因此,现在明确了10万条数据了,我们可以直接在初始化的时候就设置ArrayList的容量! 这样就可以提高效率

  1. 参考文献

List集合就这么简单【源码剖析】:

https://segmentfault.com/a/1190000014240704

  1. 更多讨论

Q1:说出ArrayList,LinkedList的存储性能和特性
A1:ArrayList的底层是数组,LinkedList的底层是双向链表。 ArrayList它支持以角标位置进行索引出对应的元素(随机访问),而LinkedList则需要遍历整个链表来获取对应的元素。 因此一般来说ArrayList的访问速度是要比LinkedList要快的 ArrayList由于是数组,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的。 因此一般来说LinkedList的增删速度是要比ArrayList要快

Q2:什么情况下你会使用ArrayList?什么时候你会选择LinkedList?
A2:多数情况下,当你遇到访问元素比插入或者是删除元素更加频繁的时候,你应该使用ArrayList。另外一方面,当你在某个特别的索引中,插入或者是删除元素更加频繁,或者你压根就不需要访问元素的时候,你会选择LinkedList。这里的主要原因是,在ArrayList中访问元素的最糟糕的时间复杂度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者删除某个元素,通常会调用System.arraycopy方法,这是一种极为消耗资源的操作,因此,在频繁的插入或者是删除元素的情况下,LinkedList的性能会更加好一点。

Q3:如何复制某个ArrayList到另一个ArrayList中去?写出你的代码?
A3:

下面就是把某个ArrayList复制到另一个ArrayList中去的几种技术:

使用clone()方法,比如ArrayList newArray = oldArray.clone();


使用ArrayList构造方法,比如:ArrayList myObject = new ArrayList(myTempObject);


使用Collection的copy方法。

注意1和2是浅拷贝(shallow copy)。

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖


“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。”

技能树·IT修真院:https://www.jnshu.com

【Java集合源码剖析】ArrayList源码剖析 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。 ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了R 阅读详情

相关推荐

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

Medlar_CN的博客 2962

关于ArrayList

1、什么是ArrayList? ArryList是实现了Icollection和List接口的类,采用数组方式进行数据存放的“动态数组”。可以动态地增加和减少元素,灵活的设置数组的大小。 2、ArrayList的使用及提供的方法 1)构造器 ArrayList提供了三个构造器: #public ArrayList(); 默认的构造器,将会以默认(16)的大小来初始化内部的数组 #pu...

weixin_30414245的博客 218

RC4加密算法详解

RC4(也称为 Rivest Cipher 4)是流密码的一种形式,流密码逐字节操作数据流。RC4 流密码是使用最广泛的流密码之一,它通过算法一次一个字节地加密消息,简单并且操作速度快。RC4是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权的用户才能享受该服务,使用 64 位或 128 位密钥大小。它通常用于安全套接层 (SSL)、传输层安全 (TLS) 等应用,也用于 IEEE 802.11 无线 LAN 标准。在存储大量的信息时,RC4展现出它的实用性,面对大量的数据,

weixin_43211186的博客 1万+

ArrayList简介

ArrayList 是一个数组列表。它的主要底层实现是Object数组,但与 Java 中的数组相比,它的容量能动态变化,可看作是一个动态数组结构。特别注意的是,当我们装载的是基本类型的数据 int,long,boolean,short,byte… 的时候,我们只能存储他们对应的包装类。

NRapid&JRapid 3541

109. 使用 SAP UI5 FileUploader 控件上传本地文件

我们可以使用SAPUI5提供的控件,将本地文件上传到远端服务器进行存储。远端服务器负责接收上传的文件的逻辑,可以采取Java,Node.js或者ABAP等任意的编程语言实现。本地文件上传也是最终用户同文件服务器交互的重要手段之一,因此文件上传这个主题,本教程会通过若干篇文章连续进行介绍。笔者还另外实现了一个不通过SAPUI5FileUploader控件,而是直接用HTML原生的input。先看本步骤完成后实现的场景。本步骤完整的源代码位置。进入目录109,运行命令行。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2235

性能调优秘籍——让OpenClaw运行速度提升10倍(2026优化版)

OpenClaw性能优化核心摘要 本文详细介绍了提升OpenClaw系统性能的关键技术,包括: 使用性能分析器进行代码级性能诊断 内存优化与高效缓存策略 并发处理优化技术 数据库查询性能提升方法 重点内容包括: 全面的性能分析工具实现(计时、内存监控、错误跟踪) 自动生成性能报告和优化建议 操作耗时与内存占用分析算法 关键性能指标(平均耗时、内存增长)计算 通过系统性的性能分析优化,可使OpenClaw运行速度提升10倍以上。

博客 898

ArrayList详解

一、介绍ArrayList是以什么数据结构实现的 ArrayList底层的数据结构是顺序表。 顺序表:物理内存上连续、逻辑上连续、大小可以动态扩展 顺序表是由数组实现的,说道这里就理一下数组、链表、顺序表之间的关系。 逻辑结构:结构定义中是对操作对像的数学描述,描述的是数据元素之间的逻辑关系。例如,线性结构,树形结构,图状结构或网状结构。它们都属于逻辑结构。 物理结构:又称存储结构,是数据结构在计算机中的表示(又称映像)。例如,数组,指针。 线性表:属于逻辑结构中的线性结构,它包括顺序表和链表。

Allence的博客 5437

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

ArrayList的介绍

ArrayList类是一个特殊的数组。它来自于System.Collections命名空间;通过添加和删除元素,就可以动态改变数组的长度。 代码介绍一下。。。 using System; using System.Collections;//arraylist的头文件 using System.Collections.Generic;//list的头文件 using System.Linq; us...

QJH_12138的博客 356

【毕设护航】从0构建YOLOv8犬类识别系统,120种犬类精准检测+可视化界面全流程指南

本文介绍了一个基于YOLOv8的120种犬类目标检测与可视化系统毕业设计项目。该项目使用Stanford Dogs数据集,将图像分类任务转化为目标检测任务。主要内容包括:数据预处理(XML标注转换为YOLO格式)、YOLOv8模型训练与测试(包含训练脚本编写和推理实现),以及基于Tkinter的图形界面开发。该项目技术链条完整,涵盖检测、分割等多任务支持,适合作为计算机视觉方向的毕业设计选题,兼具技术深度和展示效果。

LXY_LOVE36的博客 96

MOSFET雪崩特性参数解析

但是,一些电源在输出短路时,初级中会产生较大的电流,加上初级电感,器件就会有雪崩损坏的可能,因此在这样的应用条件下,就要考虑器件的雪崩能量。对于那些在MOSFET的D和S极产生较大电压的尖峰应用,就要考虑器件的雪崩能量,电压的尖峰所集中的能量主要由电感和电流所决定,因此对于反激的应用,MOSFET关断时会产生较大的电压尖峰。雪崩击穿能量标定了器件可以容忍的瞬时过冲电压的安全值,其依赖于雪崩击穿需要消散的能量。EAS单脉冲雪崩击穿能量, EAS标定了器件可以安全吸收反向雪崩击穿能量的高低。

Airer_00的博客 806

Java ArrayList 介绍

通过ArrayList存在的位置,我们就可以看出他是实现了List接口,并且同时拥有List和Collection的所有方法。elementData : 用来存储当前实际的数据(实际就是一个数组)size: 用来存储当前有效数据的长度DEFAULTCAPACITY_EMPTY_ELEMENTDATA: 用来存储默认大小的空实例的共享空数组实例。

HUAIJIUdada的博客 973

【原理图与PCB专题】使用Cadence如何在Layout时直接互换相同功能的PIN

Cadence允许我们在PCB中互换管脚,最后再反标给原理图。集成TVS管、排阻、DDR、FPGA有一些PIN是完全相同功能,可进行管脚互换的,建议使用这个功能。可降低硬件工程师与Layout工程师之间沟通成本,加快设计进度。

一点硬件 801

ArrayList介绍

ArrayList介绍 对于ArrayList,相信大家都很熟悉,天天都会接触到它。JangGwa从源码角度再和你一起熟悉一下,先简单介绍下ArrayList。 1.基于数组实现,是一个动态数组,其容量能自动增长。 2.ArrayList不是线程安全的,建议在单线程中使用,多线程可以选择Vector或CopyOnWriteArrayList。 3.实现了RandomAccess接口,可以通

i_history的博客 219

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ArrayList—— ArrayList详细介绍

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 ArrayLi

chuntiandejiaobu10的专栏 1094

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ArrayList详细介绍

ArrayList详细介绍第1部分 ArrayList介绍ArrayList简介ArrayList构造函数第2部分 ArrayList数据结构ArrayList与Collection关系如下图:第3部分 ArrayList源码解析(基JDK1.6.0_45) 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的...

狂风的博客 662

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ArrayList简单介绍

J3 - 白起 技术(集合框架) 今天来和大家聊聊ArrayList。 用过数组的小伙伴都知道,数组可以用来存储一定容量的数据从而方便我们对数据的操作。但是在使用数组时必须事先定义好一个数组的初始容量并且在这之后该数组的容量是不可变的,而且数组这个数据类型它其中的内置方法非常稀少,如果业务中要对一个集合的数据进行多种操作那么数组这种类型结构的数据将不能满足我们的需求,所以ArrayList闪亮登场。 下面我们就来认识认识这个ArrayList吧! 一、集合大家族 从图中,我们可以看出集合家族是非常..

技术分享、唠嗑水文、如有不周、还望海涵 668

关于ArrayList深入介绍

本文系统介绍了ArrayList的实现原理、性能特点及常见问题。ArrayList基于动态数组实现,支持快速随机访问(O(1)),但插入删除操作需移动元素(O(n))。文章详细解析了ArrayList的扩容机制(1.5倍增长)、线程安全性问题(Fail-Fast机制),并对比了有序/无序数据下的性能差异。针对并发场景,推荐使用CopyOnWriteArrayList等线程安全容器。同时分析了内存溢出问题(堆/栈溢出)及解决方法,包括参数调优和代码优化。通过具体代码示例展示了ArrayList的核心操作(ad

weixin_50055999的博客 1748

Java ArrayList的介绍及用法

Java的ArrayList是动态数组实现的List,具有自动扩容(初始10,满后1.5倍)、有序存储和允许重复元素的特点。它提供add/get/remove等方法,支持多种遍历方式,随机访问快但中间增删慢。需注意非线程安全问题,多线程环境需同步处理。相比LinkedList,ArrayList更适合频繁查询场景。可通过指定初始容量优化性能,是Java集合框架中最常用的List实现。

Mr_Zhen的博客 587

ArrayList使用介绍

ArrayList的应用1. ArrayList的特点2.ArrayList的主要方法 1. ArrayList的特点 集合中的List是一种有序的,可重复的集合,ArrayList是基于可动态扩展的数组实现了List的接口。因为是数组所以可以通过下标来访问集合中的元素,对随机访问有很高的效率。但在两个元素之间新增元素或删除元素则效率较低。 2.ArrayList的主要方法 创建ArrayList对象 List<String> list = new ArrayList<>();

weixin_47439387的博客 448
上一篇: JMeter工具的使用----为什么要进行压力测试?
下一篇: springboot和redis的整合
learning__java
博客等级 码龄8年 87粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值