arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容…「建议收藏」

arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容…「建议收藏」ArrayList大家都知道了吧,这是一个动态数组。以java语言来说,数组是定长的,在被创建之后就不能被加长或缩短了,因此,了解它的扩容机制对使用它尤为重要。下面,我们就一起来看看它的扩容机制是怎么实现的吧。首先我们知道,ArrayList有着三种初始化方式:1)指定大小初始化publicArrayList(intinitialCapacity)2)传入一个Collection对象初始化,并…

大家好,又见面了,我是你们的朋友全栈君。

ArrayList大家都知道了吧,这是一个动态数组。以java语言来说,数组是定长的,在被创建之后就不能被加长或缩短了,因此,了解它的扩容机制对使用它尤为重要。下面,我们就一起来看看它的扩容机制是怎么实现的吧。

首先我们知道,ArrayList有着三种初始化方式:

1)指定大小初始化public ArrayList(int initialCapacity)

2)传入一个Collection对象初始化,并将对象中的数据添加到ArrayList中public ArrayList(Collection c)

3)默认构造函数初始化public ArrayList()

ArrayList扩容机制发生在add()方法调用的时候,从下面的代码我们可以看出当使用无参构造函数创建ArrayList时,它的默认长度会为0private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

public ArrayList()

{

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

下面是add()方法的源码:public boolean add(E e)

{

//扩容

ensureCapacityInternal(size + 1); // Increments modCount!!

elementData[size++] = e;

return true;

}

根据以上我们可以看到,ensureCapacityInternal()是用来扩容的,形参为最小扩容量,进入此方法后:private void ensureCapacityInternal(int minCapacity)

{

ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));

}

通过方法calculateCapacity(elementData, minCapacity)来获取:private static int calculateCapacity(Object[] elementData, int minCapacity)

{

//如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)

{

return Math.max(DEFAULT_CAPACITY, minCapacity);

}

return minCapacity;

}

ensureExplicitCapacity方法可以判断是否需要扩容:

private void ensureExplicitCapacity(int minCapacity)

{

modCount++;

// 如果最小需要空间比elementData的内存空间要大,则需要扩容

if (minCapacity – elementData.length > 0)

//扩容 grow(minCapacity);

}

下面是重点来了,ArrayList扩容机制关键方法grow():private void grow(int minCapacity)

{

// 获取到ArrayList中elementData数组的内存空间长度

int oldCapacity = elementData.length;

// 扩容至原来的1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

// 再判断一下新数组的容量够不够,够了就直接使用这个长度创建新数组,

// 不够就将数组长度设置为需要的长度

if (newCapacity – minCapacity 

newCapacity = minCapacity;

//若预设值大于默认的最大值检查是否溢出

if (newCapacity – MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

// 调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间

// 并将elementData的数据复制到新的内存空间

elementData = Arrays.copyOf(elementData, newCapacity);

}

因此,我们可以清晰看出ArrayList扩容的本质其实就是计算出新的扩容数组的size后实例化它,并将原有数组内容复制到新数组中去。

以上就是关于ArrayList扩容机制的全部内容了,如果你还想要了解更多有关ArrayList相关的java常见问答知识,就快来关注我们的网站吧。

推荐阅读:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143995.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月11日 下午10:00
下一篇 2022年5月11日 下午10:20


相关推荐

  • 【转】python中的map,filter,reduce,lambda

    【转】python中的map,filter,reduce,lambda

    2021年8月21日
    56
  • JS页面跳转页面大全

    JS页面跳转页面大全JS 页面跳转大全所谓的 js 页面跳转就是利用 javesrcipt 对打开的页面 ULR 进行跳转 如我们打开的是 A 页面 通过 javsrcipt 脚本就会跳转到 B 页面 目前很多垃圾站经常用 js 跳转将正常页面跳转到广告页面 当然也有一些网站为了追求吸引人的视觉效果 把一些栏目链接做成 js 链接 但这是一个比较严重的蜘蛛陷阱 无论是 SEO 人员还是网站设计人员应当尽力避免 常用的 JS 页面跳转代码调用大全 马海祥

    2026年3月17日
    2
  • 业务流程引擎_业务流程管理

    业务流程引擎_业务流程管理一般的时候,我们都采用编程式开发,编程式开发的好处非常明显:直接、高效、自由,当然其缺点也是有的,与其优点刚好相对,因为直接,所以有些变化都要进行代码上的修改;因为高效,所以一旦出问题,导致的结果也比较严重,因为自由,所以带来的修改风险也比较大。  这也就是许多大的公司都在进行流程化开发的重要原因之一,比如:上海普元,Livebos,Justep,还有许许多多知名不知名的公司都有类似的流程化开发

    2026年4月13日
    5
  • faster-rcnn原理介绍

    faster-rcnn原理介绍本博客大部分参考http://blog.csdn.net/zy1034092330/article/details/62044941,其中夹杂着自己看论文的理解效果图作者提到目标检测,就不得不RBG大神,该大神在读博士的时候就因为dpm获得过pascalvoc的终身成就奖。博士后期间更是不断发力,RCNN和Fast-RCNN,Faster-Rcnn就是他的典型作品。前言讲起faster-rcnn

    2022年10月4日
    4
  • 2026全网最全国产OpenClaw盘点:10款主流产品横向测评

    2026全网最全国产OpenClaw盘点:10款主流产品横向测评

    2026年3月16日
    3
  • arp内网攻击_外网和内网怎么设置

    arp内网攻击_外网和内网怎么设置arpspoof是一款进行arp欺骗的工具,攻击者通过毒化受害者arp缓存,将网关mac替换为攻击者mac,然后攻击者可截获受害者发送和收到的数据包,可获取受害者账户、密码等相关敏感信息。本次测试是在局域网内进行,利用kali截获centos相关数据攻击者ip:192.168.157.129受害者ip:192.168.157.2501、在kali中开启端口转发功能:echo…

    2022年10月7日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号