ArrayList源码分析

FLUKA软件在Ubuntu的安装指南(亲测有效) FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程 阅读详情

部分成员变量

  • private static final int DEFAULT_CAPACITY = 10;
    默认数组大小

  • private static final Object[] EMPTY_ELEMENTDATA = {};
    一个空的数组

  • private transient Object[] elementData;
    ArrayList实际上存储元素的数组

  • private int size;
    ArrayList实际包含的元素


构造函数

默认构造方法,指向一个空的数组

public ArrayList() {
    super();
    //初始化数组,指向空数组
    this.elementData = EMPTY_ELEMENTDATA;
}

用一个Collection对象来实例化ArrayList

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}

指定初始容量初始化ArrayList

public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

主要方法实现

add(E):boolean

public boolean add(E e) {
    //判断是否需要扩容
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   elementData[size++] = e;
   return true;
}

private void ensureCapacityInternal(int minCapacity) {
    //如果数组为空,取(默认数组大小,当前数组包含元素数量+1)的最大值
    if (elementData == EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(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;
    //扩容规则
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    //创建扩容后的数组并将引用返回至elementData
    elementData = Arrays.copyOf(elementData, newCapacity);
}

add(int, E):void

public void add(int index, E element) {
    //检查下标合法性
    rangeCheckForAdd(index);

    //是否需要扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    //将index后的元素往后移动一位
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;//元素数量加一
}

get(int):E

public E get(int index) {
    //检查下标合法性
    rangeCheck(index);

    return elementData(index);
}

remove(int):E

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;
}

clear():void

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

    size = 0;
}

trimToSize():void

public void trimToSize() {
 modCount++;
     //数组容量依据当前实际大小进行收缩
    if (size < elementData.length) {
        elementData = Arrays.copyOf(elementData, size);
    }
}

总结

ArrayList实际就是依据数组来存储,与普通数组最大不同在于ArrayList可以动态伸缩,原理就是依靠System类内部的arraycopy方法。整体代码很简单,基本就是对数组的常规操作。

淘宝抓包,直达函数内部request请求体和response响应体, 告别FD, Charles,SSL,justtrustme 等http代理,证书工具。 淘宝抓包,hook发包函数,直接获取response相应数据 阅读详情

相关推荐

【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection

文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500

轻舟的万重重山 1万+

ArrayList 源码分析

1222222222

lwj_hewo的博客 168

Canoe主要功能的详细介绍

CANoe是德国Vetor公司推出的一款用于总线开发的设备,全程为CAN open environment。后来随着总线技术的发展,CANoe不仅限于CAN类型的总线开发,还包含LIN、FlexRay、MOST和以太网等开发。在车载网络和ECU开发、测试和分析方面,CANoe几乎长期占据着垄断地位,当然是因为其强大的功能性了。目前用这个工具的主要是整车厂和供应商的网络设计工程是、开发工程师和测试工程师。小编当时安装CANoe的时候也是花了一定的时间和精力,好在没有崩溃。

车载测试 3721

【JDK源码分析系列】ArrayList源码分析

【JDK源码分析系列】ArrayList源码分析 【1】ArrayList源码MCL视图 ArrayList的MCL视图如下图所示,包括内部类的MCL视图; 【2】ArrayList源码分析相关知识点总结 /** * 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持; * 即用transient关键字标记的成员变量不参与序列化过程;...

CopperSun 技术博客 609

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1054

IBM System x3650 M5 IMM配置

1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服...

血饮渊虹的博客 4万+

Java基础之ArrayList源码分析

ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用。

Soinice的博客 403

【技能】OpenClaw Skills学习及手搓一个极简skill

本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感

海兰 3974

ArrayList的源码分析

来源:https://www.cnblogs.com/beppezhang/p/6560710.html 在项目中经常会用到list集合来存储数据,而其中ArrayList是用的最多的的一个集合,这篇博文主要简单介绍ArrayList的源码分析,基于JDK1.7: 这里主要介绍 集合 的属性,构造器,和方法:方法主要基于 add(E e),get(int index),remove(int i...

rentian1的博客 228

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

一键难忘的博客 2415

深度学习在地质勘探中的应用:使用Python构建卷积神经网络进行地震数据分析

在本文中,我们介绍了如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。我们使用了Python编程语言和TensorFlow框架构建了一个CNN模型,并使用地震数据进行了训练和评估。在本文中,我们将探讨如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。首先,我们需要获取地震数据集。通过本文的介绍,希望您能对深度学习在地质勘探领域的应用有更深入的了解,并能够应用这些技术来解决实际问题。在准备好地震数据和构建CNN模型后,我们需要将数据分为训练集和测试集。

斌擎科技 1471

131面试必问:ArrayList源码分析&手写ArrayList

简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。所以这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的。 更多面试题:面试题内容聚合 源码分析 1. 属性分析 /** *默认初始化容量 ...

AI乔治 211

基于TIA博途的一阶滞后滤波+中位值滤波+堆栈平均值滤波算法SCL语言程序(封装FB库)

基于TIA博途的一阶滞后滤波+中位值滤波+堆栈平均值滤波算法SCL语言程序(封装FB库)

Robot_PLC_HMI_Automation 2177

ArrayList常用方法及源码分析

ArrayList常用方法!!!!!!!!!!!

o676448的博客 418

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Vector,ArrayList,Linkedlist源码分析

list接口和set集合

Cocobuhui的博客 973

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java源码分析之ArrayList

ArrayList源码分析 ArrayList作为一个java中对数据进行存储的容器,是java中List<E>接口的核心实现类 有句古话这么来着:“万变不离其宗”,观其源码,通俗的来说,ArrayList其实就是一个数组 数组众所周知,他的定义必须申请一个规定长度的存储空间,是顺序存储结构,但是ArrayList 似乎可以无限制的添加数据,这是为何,这其实是这种扩容机制系统悄悄地在背后棒你做了 就形成了表面上可以无限制地添加数据的现象 下面,让我们来看看ArrayList的源码分析.

qq_48201696的博客 441

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ArrayList和LinkedList的区别和源码分析

从源码可以看出,ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,比如index < size / 2,则从左边开始查找,反之从右边开始查找,但是还是比ArrayList要慢。ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;//向左挪一位,index位置原来的数据已经被覆盖了。

weixin_62198635的博客 732

ArrayList中add方法源码分析~

首先要明确ArrayList的底层实现是数组利用空参创建的集合时,在底层创建一个默认长度为0的数组添加第一个元素时,底层会创建一个新的长度为10的数组存满时,会扩容1.5倍如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。

2501_90392153的博客 1904

java ArrayList源码分析

ArrayList是 Java 标准库中的一个非常常用的类,它实现了List接口,提供了一个动态数组的实现,可以用来存储一系列的元素。sizeArrayListArrayListArrayListsizeadd(E e)clear()size()ArrayList还实现了一些其他的内部方法和嵌套类,比如Itr(迭代器)、ListItr(列表迭代器)、SubList(子列表)等,这些类和方法支持ArrayList的高级操作,如迭代、元素搜索、子列表操作等。此外,ArrayList还重写了clone()

qq_36070104的博客 1092

java集合之ArrayList源码分析

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

2501_92608043的博客 805

源码分析_JDK8 ArrayList源码分析

ArrayList类结构图实现Serializable接口的意义:如果可序列化类未显式声明serialversionUID,则序列化运行时将计算默认的serialVersionUID值。默认的serialversionUID计算是对类细节高度敏感,这些细节可能因编译器而异,因此可能在反序列化过程中可能导致意外的InvalidClassException。因此,为了在不同Java编译器之间保证一致的...

weixin_39841717的博客 70

面试必会之ArrayList源码分析&手写ArrayList

注:本文所有方法和示例基于jdk1.8 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。所以这个过程在多线程的环境下是不能保证具有原子性的,因此A...

Java笔记虾 1356
上一篇: 阿里服务器部署
下一篇: 动态规划:国王与金矿
HamalAlpha
博客等级 码龄11年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值