03_ArrayList核心方法的原理

默认的构造函数,直接初始化一个ArrayList实例的话,会将内部的数组做成一个默认的空数组,{},Object\[\],他有一个默认的初始化的数组的大小的数值,是10,也就是我们可以认为他默认的数组初始化的大小就是只有10个元素

基本上最好是给ArrayList构造的时候,给一个比较靠谱的初始化的数组的大小,比如说,100个数据,1000,10000,避免数组太小,往里面塞入数据的时候,导致数据不断的扩容,不断的搞新的数组

add()方法的源码

arduino 复制代码
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}
scss 复制代码
ensureCapacityInternal(size + 1);  // Increments modCount!!

你每次往ArrayList中塞入数据的时候,人家都会判断一下,当前数组的元素是否塞满了,如果塞满的话,此时就会扩容这个数组,然后将老数组中的元素拷贝到新数组中去,确保说数组一定是可以承受足够多的元素的

set()方法的源码

ini 复制代码
public E set(int index, E element) {
    rangeCheck(index);

    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

add(index, element)方法的源码

scss 复制代码
public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

get()方法的源码

scss 复制代码
public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

remove()方法的源码

ini 复制代码
public E remove(int index) {
    rangeCheck(index);

    modCount++;
    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

    return oldValue;
}

总结

remove()

add(index, element)

这个两个方法,都会导致数组的拷贝,大量元素的挪动,性能都不是太高,基于数组来做这种随机位置的插入和删除,其实性能真的不是太高

add()、add(index, element),这两个方法,都可能会导致数组需要扩容,数组长度是固定的,默认初始大小是10个元素,如果不停的往数组里塞入数据,可能会导致瞬间数组不停的扩容,影响系统的性能

set()、get(),定位到随机的位置,替换那个元素,或者是获取那个元素,这个其实还是比较靠谱的,基于数组来实现随机位置的定位,性能是很高的

相关推荐
贰先生7 分钟前
Xiuno BBS 审计之问题10:用户密码不符合现代密码存储规范
后端
IT_陈寒24 分钟前
SpringBoot自动配置的坑,我的Bean怎么不生效?
前端·人工智能·后端
CoderYanger34 分钟前
视频切割脚本(Python版)
linux·开发语言·windows·后端·python·程序人生·职场和发展
程序员爱钓鱼1 小时前
Rust 数据类型详解:整数、浮点数、布尔、字符、元组和数组
后端·rust
geovindu1 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
AC赳赳老秦1 小时前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
CoderYanger1 小时前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
从零开始的代码生活_1 小时前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
mCell10 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯11 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式