Java集合源码分析—ArrayList

秃鹰搜索优化算法(BES)详解:从自然捕食到全局优化 秃鹰搜索优化算法(Bald Eagle Search Optimization Algorithm,BES)是由马来西亚学者Alsattar等人于2020年提出的一种新型元启发式优化算法。该算法灵感来源于秃鹰在自然界中高超的捕食行为,特别是其独特的狩猎策略和卓越的视觉搜索能力,模拟了秃鹰捕食鲑鱼等猎物的完整过程。 阅读详情

ArrayList源码分析

ArrayList结构

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList继承自AbstractList,实现了List、RandomAccess、cloneable、Serializable接口,支持随机访问、克隆和序列化。和Vector不同,ArrayList不是线程安全的容器,所以,建议在单线程中使用它,而在多线程中使用Vector或CopyOnWriteArrayList,或者用synchronizedList将其包装。

源码分析

属性

// 序列号
private static final long serialVersionUID = 8683452581122892189L;

// ArrayList的默认初始容量
private static final int DEFAULT_CAPACITY = 10;

// 当实例化是指定容量为0时,返回该数组
private static final Object[] EMPTY_ELEMENTDATA = {};

// 空数组,实例化时没有指定容量,返回该数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

// 当前数据存放的地方
transient Object[] elementData; // non-private to simplify nested class access

// ArrayList中存储的数据量
private int size;

// 集合数组被修改次数标识
protected transient int modCount = 0;

构造

// 创建一个指定初始容量大小的ArrayList
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);
    }
}

// 没有指定初始容量时,返回一个指定的空数组
// 当第一次add时,会扩容为10
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

// 用collection创建一个ArrayList
public ArrayList(Collection<? extends E> c) {
    // 把集合转化为Object[]数组
    elementData = c.toArray();
    // 直接将数组长度赋值给size
    if ((size = elementData.length) != 0) {
        // 如果不是Object[]数组,利用copyOf构造一个Object[]数组
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // 如果size为0,就用空数组替换
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

方法

add(E e)
public boolean add(E e) {
    // 确保内部容量足够
    ensureCapacityInternal(size + 1);  
    // 将数据放在size上,将size++
    elementData[size++] = e;
    return true;
}
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    // 第一次添加数据,便取10
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // 当元素个数大于数组容量,就需要扩容
    if (minCapacity - elementData.length > 0)
        // 扩容
        grow(minCapacity);
}
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // 扩容1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 第一次扩容 0 - 10 < 0,所以取10
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // 拷贝到新数组
    elementData = Arrays.copyOf(elementData, newCapacity);
}
void add(int index,E element)
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++;
}

//检查下标是否越界
private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
remove(int index)
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(Object o)
public boolean remove(Object o) {
    if (o == null) {
        for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                fastRemove(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++;
    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
}
trimToSize()
// 将数组大小调整到ArrayList存储元素的大小
public void trimToSize() {
    modCount++;
    if (size < elementData.length) {
        elementData = (size == 0)
          ? EMPTY_ELEMENTDATA
          : Arrays.copyOf(elementData, size);
    }
}
clear()
public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}
indexOf(Object o)
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;
}
contains(Object o)
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
Calibre:LVS 快速debug short/open技巧 用Fix Suggestion和Short Isolate两种方法debug LVS问题 阅读详情

相关推荐

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1871

ArrayList集合源码解读

引言:最近帮其它部门面试了几位java开发人员,简历上写的都是3/4年开发经验,经过面试下来发现他们所体现出来的技术深度和广度最多均在1.5年以内,具体有多少包装成分也不去深究,我面试是一定会问到集合的,由浅至深,基本套路就是:你最常用的集合有哪些(大部分人应该都是ArrayList和HashMap吧)?说说你对ArrayList的理解?平时使用ArrayList遇到过什么问题?ArrayList...

分享传递价值 753

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6606

【JAVA集合篇】ArrayList源码详解

ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。在ArrayList集合里面可以存储任何类型的数据, 而且它是一个顺序容器,存放的数据顺序就是和我们放入的顺序是一致的,而且它还允许我们放入null元素。

初念初恋的博客 1731

NCCL使用指南-进阶篇

前文介绍了NCCL的常用环境变量,本文介绍了NCCL-test性能基准测试,以及一些大规模集群测试的经验数据。

father_yingying的博客 1408

IBM V3700更换控制器2(503错误)

正常的node1 ,机器代码版本:7.5.0.3, 机器代码构建:115.51.1509171734000。耐心等待后,刷新,看到node2,状态变成 节点状态:服务,错误:656,版本和node1一样了。新换的node2 ,机器代码版本:7.2.0.5, 机器代码构建:87.8.1404221000。耐心等待,刷新,node2,状态看到了,节点状态:活动,错误 724 1 1 0。拔出故障的控制,把内存和HBA卡,电池换到新的控制器。新的控制还是报错无法使用,节点状态:服务 错误:503。

klyshao的博客 4450

Java集合源码浅析(一) : ArrayList

(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.youkuaiyun.com/article/details/105317442冷血之心的博客) 背景 一直都有这么一个打算,那就是将Java中常见集合的源码进行一个全面的梳理(尽管已经有很多人进行了梳理总结)。重复造轮子的意义就在于,笔者可以亲自去阅读与欣赏JDK集合源码,学习JDK设计者们那优雅的code风格。 那么,就...

冷血之心的博客 2139

STM32HAL库硬件I2C驱动INA226避坑指南:从寄存器配置到电流测量实战

本文详细解析了使用STM32的HAL库硬件I2C驱动INA226电流/功率监测芯片的完整流程与常见陷阱。内容涵盖从硬件I2C配置、寄存器(特别是配置与校准寄存器)的深度解析、健壮的驱动函数封装,到实战中的校准技巧与滤波优化,旨在帮助开发者避开通信失败、数据不准等典型问题,实现高精度电流测量。

x1y2z的博客 791

Java集合——ArrayList源码解析

ArrayList源码解析ArrayList是什么?继承结构域构造函数扩容获取大小和判空截断克隆转为数组操作集合是否包含元素和获取下标获取元素设置元素添加元素添加集合删除单个元素删除范围元素求差集和交集全清序列化和反序列化获取迭代器迭代器——Itr内部类迭代器——ListItr内部类forEach和spliterator()不讲获取子串字串——SubList类(以下是类介绍)继承结构域构造函数设置元素获取元素获取大小添加元素删除元素获取迭代器获取子串的子串子串spliterator(子串没有重写forEac

松仔Log的博客 1803

【STM32系统及仿真】基于STM32+蓝牙设计的智能窗帘系统__资料编号8

本项目设计并实现了一种基于STM32单片机的智能窗帘系统,集成了光敏传感器、温湿度传感器、蓝牙模块和OLED显示屏,实现了窗帘的自动调节、环境监测和远程控制功能。系统采用STM32F103C8T6作为主控制器,通过光敏传感器检测环境光强,温湿度传感器监测室内环境,蓝牙模块实现与手机APP的通信,用户可以通过APP远程控制窗帘的开合状态。系统在检测到环境光照强度或温度超出设定范围时,可自动调节窗帘的开合,以达到节能和提高舒适度的目的。

嵌入式阿齐Archie 2万+

Python从0到100(二):Python语言介绍及第一个Pyhon程序

Python从0到100(二):Python语言介绍及第一个Pyhon程序。与C和Java比,Python的学习成本和难度曲线不是低一点,更适合新手入门,自底向上的技术攀爬路线。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5440

java集合-ArrayList源码详解

内容详细地分析了ArrayList源码,ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。

qq_52616972的博客 704

大模型——Dify:知识库与外部知识库

摘要 Dify的知识库功能为开发者提供了动态知识管理解决方案,超越了大模型静态预训练数据的限制。知识库支持多种文档格式(如txt、pdf、docx等),通过文档分段、索引设置和检索优化机制提升LLM的响应准确性。系统提供高质量和经济两种索引模式,前者采用向量化检索技术,后者使用关键词匹配以降低成本。知识库支持元数据管理,包括自动生成的内置元数据和用户自定义元数据,便于内容分类和检索。对于高级需求,Dify还支持连接外部知识库,通过API实现跨平台数据共享和检索优化,满足企业级知识管理需求。

732

java集合之ArrayList源码分析

ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。

2501_92608043的博客 805

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一文读懂,java list集合详解及arraylist,linkedlist集合底层源码分析

Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象多态的方式具体的实现类ArrayListCollection集合常用方法方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空集合的长度,也就是集合中元素的个数List集合的概述。

m0_58975186的博客 1004

精雕软件(JDpaint) 5.5 绿色版

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

Java 集合体系之 ArrayList 源码分析

前言 ArrayList 的底层我们都知道,是通过数组来实现的,那么其内部又是如何做到可动态扩展的呢?下面就来扒开源码一探究竟。 源码分析 直接上代码,注释写的很清晰了已经: public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.

Airsaid 4626

java源码分析_深入分析java集合ArrayList(源码分析)

这篇文章开始介绍ArrayList。ArrayList基本上是我们在平时的开发当中,使用最多的一个集合类了,它是一个其容量能够动态增长的动态数组。所以这篇文章,旨在从源码的角度进行分析和理解。为了使得文章更加有条理,还是先给出这篇文章的大致脉络:首先,ArrayList的基本介绍和源码API(只给出方法分析,重要的方法给出详细代码)。然后,介绍遍历ArrayList的几种方式接下来,叙述一下Arr...

weixin_33995900的博客 169

arraylist 后往前遍历_深入分析java集合ArrayList(源码分析)

这篇文章开始介绍ArrayList。ArrayList基本上是我们在平时的开发当中,使用最多的一个集合类了,它是一个其容量能够动态增长的动态数组。所以这篇文章,旨在从源码的角度进行分析和理解。为了使得文章更加有条理,还是先给出这篇文章的大致脉络:首先,ArrayList的基本介绍和源码API(只给出方法分析,重要的方法给出详细代码)。然后,介绍遍历ArrayList的几种方式接下来,叙述一下Arr...

weixin_42509396的博客 187

Java集合:ArrayList的使用及源码分析、Vector和LinkedList的使用

ArrayList的使用及源码分析

qq_59212867的博客 304

java集合-ArrayList/Vector/ LinkedList源码分析

以上策略不适用,编者重写了else语句,会直接选择在DEFAUIT_CAPCITY和minCapacity中最大的那个(因为需要满足存储的需求),可以看到这里的DEFAUIT_CAPCITY被初始化为一个长度为 10 的数组。用crtl+b步入add函数,if语句用来判断位置是否已满,若相等则说明已满,需要用grow()扩展,接着就是赋值和将size++,若长度足够,则不需要调用grow()没有被显式设置,扩容时的增长量将与当前容量相同,会使用推荐的增长策略(通常是。引用,指向新的数组,完成扩容操作。

2301_81088399的博客 894

【初探Java之路 六 】集合1-ArrayList和LinkedList的使用与源码分析

ArrayList是Java集合框架中的一个动态数组实现。它就像一个会自动扩展的魔法背包,当你往里面塞更多东西时,它会自动变大。//学号//姓名//年龄//居住地return sid;return age;/*1:用输出语句完成主界面的编写2:用Scanner实现键盘录入数据3:用switch语句完成操作的选择4:用循环完成再次回到主界面*///创建集合对象,用于保存学生数据信息//用循环完成再次回到主界面//用输出语句完成主界面的编写。

z17711802963的博客 1693

Java 集合—— ArrayList 源码分析

分析 ArrayList 的底层数据结构和扩容机制。

weixin_44814196的博客 1130

[Java 集合] ArrayList源码分析

[Java 集合] — ArrayList源码分析 源码基于JDK 11 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable{ } 一、属性 private static final long serialVersionUID = 8683452581122892189L; //默认容量 private static final i

zhangsan_716的博客 173

【Java集合】ArrayList源码分析

作为一个常用的List接口实现类,日常开发过程中使用率非常高,因此有必要对其原理进行分析。本文将对其源码做详细的分析,让你快速了解ArrayList的底层原理。

小七的博客 1064

05Java集合-9. ArrayList集合源码分析

05Java集合-9. ArrayList集合源码分析*

学无止境 310

Java集合之ArrayList源码分析

概述 ArrayList可以理解为动态数组, 根据MSDN的说法, 就是Array的复杂版本. 与数组相比, 它的容量能动态增长. ArrayList是List接口的可变数组的实现. 实现了所有可选列表操作, 允许包括null在内的所有元素. 数组的特点, 查询快增删慢. 每个ArrayList实例都有一个容量, 该容量是指向用来存储列表元素的数组大小. 随着向ArrayList中不断添加元...

烟草的香味的博客 158

Java简单集合之ArrayList源码分析

简介 ArrayList是Java集合框架中List接口的一个实现类。底层是数组,相当于动态数组。与Java中的数组相比,它的容量能够动态增长。 ArrayList是Vector的翻版,区别在于ArrayList是线程不安全的,而Vector则是线程安全的。但是Vector是一个较老的集合,在Java中属于保留的集合类,其具有很多缺点,不建议使用。 ArrayList可以说是我们使用最多的List集合,它有以下特点: 1.它是基于数组实...

zhanqinghua123的博客 274
上一篇: Java基础总结三(泛型、异常)
下一篇: Java集合源码分析—LinkedList
<天各一方>
博客等级 码龄6年 17粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值