zoukankan      html  css  js  c++  java
  • ArrayList add方法的实现之扩容

    初探ArrayList的1.5倍扩容

    add方法是通过在list的尾部追加元素的方法,添加数据的。

    其中,调用了一个叫ensureCapacityInternal方法,实现list的容量换算等:

    注意:参数传的是当前需要的最小的容量,方法首先确认当前ArrayList实例是否为空,如果为空则比较所需容量和默认容量,取其大者作为所需最小容量值。然后执行ensureExplicitCapacity进一步确定容量,以及是否需要扩容。当所需最小容量大于当前elementData数组长度时,要进行扩容操作。

    以上只是真实容量和所需容量的比较,其目的是计算出list的最终容量。真正实现扩容的方法是grow方法:

    通过上述:我们大概可知当add一个元素时候的扩容流程。

    添加一个元素,首先计算当前的list所需最小的容量大小,是否需要扩容等。当需要扩容时:

    1.得到当前的ArrayList的容量(oldCapacity)。

    2.计算除扩容后的新容量(newCapacity),其值(oldCapacity + (oldCapacity >> 1))约是oldCapacity 的1.5倍。

    这里采用的是移位运算(关于移位运算,后续会讲到)。为什么采用这种方法呢?应该是出于效率的考虑。

    3.当newCapacity小于所需最小容量,那么将所需最小容量赋值给newCapacity。

    4.newCapacity大于ArrayList的所允许的最大容量,处理。

    5.进行数据的复制,完成向ArrayList实例添加元素操作。

  • 相关阅读:
    服务器运维
    mysq配置
    PHP-FPM进程数的设定
    vsftpd 安装配置详细教程
    php-fpm性能优化
    如果不知道MySQL当前使用配置文件(my.cnf)的路径的解决方法
    搭建linux+nginx+mysql+php环境
    PHP 页面编码声明方法详解(header或meta)
    Linux内核的一些知识。
    Connector框架笔记
  • 原文地址:https://www.cnblogs.com/thiaoqueen/p/8392897.html
Copyright © 2011-2022 走看看