ArrayList的底层数据结构

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常 本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。 阅读详情

转自:https://www.cnblogs.com/dassmeta/p/5334960.html

ublic class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * Shared empty array instance used for empty instances.
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
     * DEFAULT_CAPACITY when the first element is added.
     */
    private transient Object[] elementData;

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;
}

ArrayList 的底层最重要的两个属性:Object 数组和 size 属性。

Add方法

	public boolean add(E e) {
		//先判断长度用不用扩容,要扩容的话就马上进行扩容
		ensureCapacityInternal(size + 1);
		//将元素放进数组里
		elementData[size++] = e;
		return true;
	}
//minCapacity是所需的最小容量
 public void ensureCapacity(int minCapacity) {

        int minExpand = (elementData != EMPTY_ELEMENTDATA)  ? 0 : DEFAULT_CAPACITY;
        //如果已经大于初始容量就扩容
        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }

    private void ensureExplicitCapacity(int minCapacity) {
        //大于数组的长度扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    private void grow(int minCapacity) {

        int oldCapacity = elementData.length;
        //旧容量+旧容量/2
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //新容量还是没大于所需的最小容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;

        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);

        //minCapacity通常接近大小,所以这是一个胜利
        elementData = Arrays.copyOf(elementData, newCapacity);

    }

    private static int hugeCapacity(int minCapacity) {

        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();

        return (minCapacity > MAX_ARRAY_SIZE) ?

            Integer.MAX_VALUE :

            MAX_ARRAY_SIZE;

    }

2点结论:

  a. ArrayList 是通过将底层 Object 数组复制的方式(System.arraycopy方法)来处理数组的增长;

  b. 当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量(grow方法)。

ArrayList与Vector的区别

 

1) vector 是线程同步的,所以它也是线程安全的,而arraylist 是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用 arraylist效率比较高。

 

2)如果集合中的元素的数目大于目前集合数组的长度时,vector 增长率为目前数组长度的100%, 而arraylist 增长率为目前数组长度的50% .如果在集合中使用数据量比较大的数据,用vector有一定的优势。

 

3)如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是O(1) ,这个时候使用vector和arraylist都可以。

 

而如果移动一个指定位置的数据花费的时间为O(n-i)n为总长度,这个时候就应该考虑到使用linklist ,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

 

 

 

 

 

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析 本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。 阅读详情

相关推荐

大模型学习路线之多模态模型

​ (Frankly speaking,博主太懒了)章节一只对CLIP、BLIP、BLIP2、InstructBLIP进行了整理,章节二以CLIP、VisualGLM作为实践案例。​ 实际上多模态模型除了CLIP、BLIP、BLIP2、InstructBLIP,还有LLaVA、miniGPT4,以及国内清华的VisualGLM、阿里的Qwen-VL等。(更多多模态原理可以看文末的参考说明)一、多模态模型 & 理论。

2401_86435672的博客 2287

ArrayList(JDK1.8)源码+底层数据结构分析

ArrayList 的底层数据结构是一维数组,而且是动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList实例的容量。这可以减少递增式再分配的数量。

m0_49692893的博客 2535

通达信强龙趋势幅图指标 - 精准捕捉趋势,把握强势行情,多角度分析个股,强弱一目了然

STICKLINE(趋势>0 AND SJTJ,4.8,5.8,1.5,0),COLORYELLOW;STICKLINE(资金>0 AND SJTJ,1.2,2.2,1.5,0),COLOR0080FF;STICKLINE(异动>0 AND SJTJ,0,1,1.5,0),COLORFF0080;STICKLINE(异动=0 AND SJTJ,0,1,1.5,1),COLORGRAY;

Q1809330692的博客 5627

全网最全ArrayList底层原理实现

1. ArrayList集合底层数据结构 1. ArrayList集合介绍 ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。默认初始容量是10。默认初始容量为10。随着ArrayList中元素的增加,它的容量也会不断的自动增长。在每次添加元素时,Arra

JAVA技术博客 2666

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2726

RAG效果调优清单(命中率提升3倍)

本文提出了一套工程可落地的RAG(检索增强生成)模型组合方案,强调通过最优组合实现效果、成本和扩展性的平衡。核心架构包括Embedding模型、向量数据库检索、Rerank模型和LLM生成四个环节,推荐了四种具体组合方案:本地最优性价比(bge+reranker+Qwen 7B)、效果优先(bge-large+reranker+14B模型)、高并发(轻量模型+vLLM)和中英混合(多语言模型)。文章指出Embedding决定检索下限,Rerank提升准确率上限,LLM影响最终体验,并提供了不同场景的优化策略

刘一说的IT专栏 520

ArrayList底层详解

ArrayList底层详解一、ArrayList集合底层数据结构二、ArrayList继承关系1、Serializable标记性接口2、Cloneable 标记性接口浅拷贝深拷贝3、RandomAccess标记接口4、AbstractList抽象类三、ArrayList源码 一、ArrayList集合底层数据结构 ArrayList集合介绍 List 接口的可调整大小的数组实现。 数组:一旦初始化长度就不可以发生改变 数组结构介绍 增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。 查询快:

zsxfa的博客 5239

科研问答:医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

MD Code 1507

ArrayList底层结构及原理分析

ArrayList是 Java 中最常用的集合类之一,隶属于java.util包,底层基于动态数组实现。它具有高效的随机访问性能和灵活的动态扩容能力,非常适合存储和操作有序数据集合。ArrayList是List接口的一个实现类,支持动态数组的操作,允许存储重复元素,并维护插入的顺序。ArrayListArrayListnullArrayListObjectArrayListsizeArrayList当向ArrayList中添加元素时,如果当前数组容量不足,将触发扩容机制。默认情况下,ArrayList。

Flying_Fish_roe的博客 1860

Android 14.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

在14.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析实现这个功能

安卓兼职framework和app工程师的博客 1309

【电机驱动与运动控制】期末重点问题集合

问题1 梯形曲线和S形曲线各自的特点和区别,比较梯形和S形曲线位置、速度、加速度、加加速度的区别。 问题2 总惯量的计算包含哪几个部分? 哪几个部分需要进行折算? 在齿轮箱的输出侧(2号轴)总惯量需要折算到齿轮箱的输入侧(1号轴) 为什么需要折算? 齿轮箱比的存在使2号轴的转速和电机的转速不同 问题3 指出每个部分的名称。 每个部分的功能。 主磁极的励磁绕组:绝大部分直流电机都是由励磁绕组通以直流电建立主磁场; - 电枢铁心:在两个主磁极内表面之间,由硅钢片叠成的圆

【人工智障 | 计算鸡视觉 | 机器孩】 5703

ArrayList底层原理

ArrayList

Edward的博客 356

基于模糊神经网络实现水质评价预测 - Matlab源码

首先定义输入层、隐含层和输出层的节点数,并初始化权重和阈值,然后开始训练模型,在每轮训练中通过比较模型的输出值与实际值的误差来更新权重和阈值,直到误差达到最小值,为了提高模型的性能,我们可以采用交叉验证等技术进行优化。首先需要准备好数据集,使用的是嘉陵江的水质监测数据集,数据集包含了多个指标,如 pH 值、溶解氧、总氮、总磷等,以及相应的水质等级,我们需要将数据集分为训练集和测试集。在当今环境日益恶化的情况下,水质监测变得越来越重要,模糊神经网络作为一种新型的。

weixin_50547796的博客 147

ArrayList的扩容机制和核心底层数据结构

ArrayList 底层数据结构 transient Object[] elementData; // 用于存储数据的buffer数组 在 ArrayList集合的底层是由一个可变的动态 Object[]数组组成的,由于他是由数组构成的,所以该集合类框架对于随机访问的效率很高,时间复杂度为 O(1)。 public boolean add(E e) { modCount++;// 结构更改次数 add(e, elementData, size);// 套娃

LengDanRan 893

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java 的 ArrayList 的底层数据结构

  1. 数据结构--ArrayList源码摘要 public class ArrayList&lt;E&gt; extends AbstractList&lt;E&gt; implements List&lt;E&gt;, RandomAccess, Cloneable, java.io.Serializable { ...... /** ...

kakajw的专栏 400

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 中 ArrayList 的底层数据结构及相关分析

数组存储元素,其核心特点是。存储大小动态变化的数据集合。是 Java 中基于。数据量极大且变动频繁。

宋发元 1197

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java arraylist 底层_Java 的 ArrayList 的底层数据结构

1. 数据结构--ArrayList源码摘要ublic class ArrayList extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable{private static final long serialVersionUID = 8683452581122892189L;/*** De...

weixin_30258621的博客 378

深入剖析ArrayList:底层数据结构、特性与性能分析

本篇文章将深入探讨Java中常用的数据结构之一,ArrayList。我们将从其底层数据结构出发,揭示其特性和性能表现。通过深入剖析ArrayList,您将能够更明智地选择适合您的应用需求的数据结构。

m0_51535555的博客 353

数据结构之重写ArrayList的底层源码

数据结构之重写ArrayList的底层源码 重写的几个主要方法 构造方法 添加(add)方法 清除(clear)方法 添加(get)以及修改(set)方法 删除方法(remove) 查找元素的迭代器的内部类实现(Iterator) 如何合理运用这些代码,它们的时间复杂度又是多少呢? ArrayList的实现 ArrAyList是一个java里面的一种集合,它与数组最大的区别就是能够自动增大容量并

LuFei_java的博客 796

让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明

一、LinkedList(同时实现了List接口和Deque implements Queue接口) 1.LinkedList底层数据结构是一个双向链表(每个节点除了本身元素外,还包含了要指向的前一个节点Node prev和后一个节点Node next),双向链表还记录了头节点Node first和尾节点Node last. 2.链表的数据结构在逻辑上是连续的,但是在物理空间上是不连续的(因此,索引下标和头元素存放的物理内存地址是不相关的,所以不能根据索引下标直接获取到元素,需要循环遍历); 3.Linke

Dylaniou的博客 1165

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

nie2459010516的博客 651

深度对比 ArrayList 与 LinkedList:从底层数据结构到增删查改的性能差异实测

在Java集合框架中,ArrayList和LinkedList是两种常用的List实现,它们在底层数据结构、内存占用和操作性能上有显著差异。本文将从底层原理出发,逐步分析增删查改操作的性能特点,并通过模拟实测(基于理论时间复杂度和常见基准测试)来量化差异。实测部分将提供Java代码示例,帮助您直观理解。ArrayList:LinkedList:关键差异:ArrayList适合读多写少场景,LinkedList适合写多读少场景。基于时间复杂度理论,对比不同操作:增(Add):删(Delete):查(Get):

ewghjjjkjkjl的博客 843

从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低

虽然前面有写到LinkedList与ArrayList的增删改查效率的全面比较,但回想一下还是有必要对这两者的查询效率做一个单独的比较,也能进一步加深理解。这次分底层数据结构和CPU缓存两方面展开它们分别对查询效率的阐述。 一、底层数据结构对查询效率的影响 1.ArrayList底层数据结构 ArrayList底层数据结构是动态数组,创建数组时会给它分配一整段连续的物理内存空间,只要知道数组首地址和数组存储的元素类型,就可以根据指定索引值直接推导得出该索引位置对应的内存地址,进而就可以直接访问得到到该内存地

Dylaniou的博客 806

ArrayList底层数据结构+源码分析

数组与ArrayList 首先我们要知道ArrayList的底层是一个数组,也可以说本质上ArrayList就是一个普通的类,对数组进行的封装,扩展其功能。 对于数组,我们知道数组一旦确定就不能再被改变,而ArrayList可以实现自动扩容,ArrayList所谓的自动扩容其实也是新创建一个数组而已,所以我们首先了解一下数组拷贝,再来看看ArrayList是怎么扩容的。 数组拷贝 1. Arrays.copyof 我们先看看代码,看如何使用它 public static void main(String[]

weixin_45526538的博客 933
上一篇: Java 实现文件随机读写-RandomAccessFile
下一篇: TPS(Transactions Per Second)和QPS(Queries Per Second)和系统吞吐量,并发量的概念
AAA821
博客等级 码龄14年 19粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值