博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList扩容机制
阅读量:6650 次
发布时间:2019-06-25

本文共 2035 字,大约阅读时间需要 6 分钟。

这是一道有赞的面试题,JDK源码中的内容,了解一下对自己也没坏处。

ArrayList使用

一般新建ArrayList

//DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}    //相当于new ArrayList(0)    public ArrayList() {        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;    }        public ArrayList(int initialCapacity) {        if (initialCapacity > 0) {            this.elementData = new Object[initialCapacity];        } else if (initialCapacity == 0) {            this.elementData = EMPTY_ELEMENTDATA;        } else {            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);        }    }

add方法

public boolean add(E e) {        ensureCapacityInternal(size + 1);  // Increments modCount!!        elementData[size++] = e;        return true;    }         private void ensureCapacityInternal(int minCapacity) {        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);        }        ensureExplicitCapacity(minCapacity);     }           private void ensureExplicitCapacity(int minCapacity) {        modCount++;        // overflow-conscious code        if (minCapacity - elementData.length > 0)            grow(minCapacity);      }

add方法

  1. 确保内部容量足够size + 1,size为当前Arraylist元素的个数
  2. 将元素放到对应的下标
  3. 返回true

ensureCapacityInternal方法与ensureExplicitCapacity是确保数组扩容到指定的大小

grow方法

private void grow(int minCapacity) {        //之前的容量        int oldCapacity = elementData.length;        //新的容量为之前的容量 1.5倍        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 = Arrays.copyOf(elementData, newCapacity);    }
  1. 简单来说就是在增长数组的时候,与所需的最小的容量进行比较
  2. 保证要扩容的大小大于最小满足的容量
  3. 如果已经大于了最大的数组大小,再做一次最大的容量处理

最后

arraylist的源码还行吧,想要理解的更深,多做些实验才行。

转载地址:http://rtyto.baihongyu.com/

你可能感兴趣的文章
MyBatis整体Review
查看>>
ffmepg 指定RTSP网络连接模式UDP还是TCP
查看>>
linux挂载u盘
查看>>
jenkins 入门教程(中)
查看>>
关于十大黑客常用工具介绍
查看>>
notepad++ 插件推荐——快速定位文件
查看>>
作价 129 亿日元,东芝电视业务被来自中国的海信电器拿下了
查看>>
开启mysql和php慢日志方法
查看>>
如何使 vlc 支持 fdk-aac 编码(windows平台
查看>>
linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析
查看>>
备份基于Docker的PostgreSQL数据库
查看>>
感兴趣区域检测技术
查看>>
2016 Swarm周 —— 第一部分:集群安装
查看>>
数据管理 DMS :SQLServer 2008的性能优化服务发布
查看>>
linux内核中默认logo的具体位置
查看>>
指引大数据未来方向的九大真理
查看>>
印度10美元笔记本证实为一款存储设备(图)
查看>>
开源大数据周刊-第67期
查看>>
国信灵通参加信息技术与智慧政务研讨会南昌站
查看>>
云海IOP:打造应用创新利器,拥抱“互联网+”时代
查看>>