解析从源码分析常见的基于Array的数据结构动态扩容机制的详解

解析从源码分析常见的基于Array的数据结构动态扩容机制的详解

什么是动态扩容机制

动态扩容机制是指,当一个数据结构达到其容量限制时,自动增加容量大小以继续存储新的数据。在动态扩容时,需要考虑到时间和空间的平衡,因为扩容需要分配新的内存空间,在处理大量数据时,需要尽可能减少空间浪费和分配内存的时间消耗。

基于Array的数据结构

Array是一种连续存储的数据结构,可以通过数组下标来访问数据。基于Array的数据结构通常会预先分配一段连续的内存空间作为存储空间,这段空间的大小是有限制的,达到这个限制后需要进行动态扩容。

常见的基于Array的数据结构

常见的基于Array的数据结构包括ArrayList、Deque和Queue等。

示例1:ArrayList

ArrayList是Java中常用的数据结构之一,它是基于Array实现的一种动态数组。当ArrayList中元素的数量超过数组容量限制时,就需要对其进行动态扩容。

在Java中,ArrayList内部维护了一个通过数组实现的elementData数组,当元素的数量超过了数组长度时,需要进行扩容,扩容的实现如下:

/**
 * 扩容方法
 * newCapacity 扩展空间的大小
 */
private void grow(int newCapacity) {
        // 当前容量
        int oldCapacity = elementData.length;
        // 扩容后数量
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        // 如果扩容后元素数量超出容量限制则直接使用Integer.MAX_VALUE为新大小
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        // 复制元素
        elementData = Arrays.copyOf(elementData, newCapacity);
}

可以看到,在ArrayList中,扩容时,首先会将旧数组的长度增加50%,然后再根据minCapacity设置扩容后的新长度,如果minCapacity的值小于新长度,则直接将新长度设置为Integer.MAX_VALUE。

示例2:Deque和Queue

Deque是双端队列的一种实现,Queue是队列的一种实现,它们是通过Array实现的。

在Java中,ArrayDeque是Deque的一种实现方式,它的底层是一个循环数组,当数组的大小不足以容纳新的元素时,ArrayDeque采用双倍大小动态扩容机制进行扩容,其扩容实现如下:

/**
 * 扩容方法
 */
private void doubleCapacity() {
    int addCapacity;
    if (head < tail) {
        addCapacity = elements.length;
    } else {
        // 头尾都是指向数组的开头,数组末尾有空闲位置,这种情况下扩容元素个数是elements.length - head
        // 头尾相对位置不变,数组末尾无空余位置,这种情况下扩容元素个数是elements.length - head + tail
        addCapacity = elements.length - head + tail;
    }

    // 根据原始数组大小和新增元素个数,计算出新的数组大小
    int newCapacity = elements.length << 1;
    if (newCapacity < 0) {
        throw new IllegalStateException("Sorry, deque too big");
    }
    Object[] newElements = new Object[newCapacity];
    // 复制旧的数组,并修正新数组的起始位置
    System.arraycopy(elements, head, newElements, 0, addCapacity);
    System.arraycopy(elements, 0, newElements, addCapacity, tail);
    elements = newElements;
    // 重置头部和尾部的位置
    head = 0;
    tail = addCapacity;
}

可以看到,在Deque和Queue实现中,扩容时,首先会判断表头和表尾对应的元素位置,然后计算出新数组的长度,并将旧的数据复制到新的数组中。最后,将队列的头部和尾部指针指向新的数组的头尾位置。

结语

基于Array的数据结构的动态扩容机制可以提高数据结构的效率和容量,但扩容时需要考虑到时间和空间的平衡,避免浪费内存和增加内存消耗。通常,动态扩容机制都是内部实现,我们只需要了解其原理和实现过程即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析从源码分析常见的基于Array的数据结构动态扩容机制的详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 详解python数据结构之栈stack

    详解Python数据结构之栈stack 什么是栈stack 栈是一种先进后出(LIFO)的数据结构,只允许在表的一端进行插入和删除操作。栈的入口称为栈底,出口称为栈顶。栈常用于表达式求值、函数调用等场景。 栈的操作 栈的基本操作包括入栈(push)和出栈(pop)。其他常用的操作有判断栈是否为空(isEmpty)、获取栈的大小(size)和获取栈顶元素(pe…

    数据结构 2023年5月17日
    00
  • C#数据结构之堆栈(Stack)实例详解

    C#数据结构之堆栈(Stack)实例详解 在编程中,我们经常需要保存一些数据,这些数据可以根据其进入的先后顺序以及其他规则进行处理和访问。其中,堆栈(Stack)是一种简单但是非常有用的数据结构。本文将为大家详细讲解堆栈(Stack)的概念、用法以及C#中的实现方法。 堆栈(Stack)概述 堆栈(Stack)是一种后进先出(LIFO)的数据结构。也就是说,…

    数据结构 2023年5月17日
    00
  • C++深入浅出探索数据结构的原理

    标题:C++深入浅出探索数据结构的原理攻略 介绍 《C++深入浅出探索数据结构的原理》是一本深入讲解C++数据结构的书籍。在本攻略中,我们将介绍该书的主要内容和要点,以及学习该书的步骤和建议。 内容 该书分为三个部分,分别是数据结构的基础、线性表和树。 数据结构的基础 第一部分主要讲解数据结构的基础知识,包括算法分析、时间复杂度和空间复杂度等。这一部分对于初…

    数据结构 2023年5月17日
    00
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

    数据结构 2023年5月17日
    00
  • JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解

    JS中的算法与数据结构:二叉查找树(Binary Sort Tree) 什么是二叉查找树 二叉查找树(Binary Sort Tree),又称二叉搜索树或二叉排序树,是一种特殊的二叉树结构。它具有以下性质: 每个结点最多只有两个子结点。 左子树中的所有结点的值均小于它的根结点的值。 右子树中的所有结点的值均大于它的根结点的值。 没有相同节点值出现 因为具备以…

    数据结构 2023年5月17日
    00
  • 「学习笔记」数位 DP

    「学习笔记」数位 DP 意义不大的题不写了。 点击查看目录 目录 「学习笔记」数位 DP 概述 例题 P2657 [SCOI2009] windy 数 思路 代码 P4317 花神的数论题 思路 P4124 [CQOI2016]手机号码 思路 代码 haha数 题意 思路 代码 0和1的熟练 题意 思路 代码 苍与红的试炼 题意 思路 代码 概述 数位 DP…

    算法与数据结构 2023年4月17日
    00
  • 图计算引擎分析–GridGraph

    作者:京东科技 李永萍 GridGraph:Large-Scale Graph Processing on a Single Machine Using 2-Level Hierarchical Partitioning 图计算框架 图计算系统按照计算方式划分可分为:单机内存图处理系统,单机核外图处理系统,分布式内存图处理系统,分布式核外图处理系统。本文将详…

    算法与数据结构 2023年4月20日
    00
  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部