文档章节

ArrayList之add(E e)学习笔记 jdk8版

yongzhong
 yongzhong
发布于 2015/02/04 22:16
字数 427
阅读 410
收藏 3


/**
 * Appends the specified element to the end of this list.
 *
 * @param e element to be appended to this list
 * @return <tt>true</tt> (as specified by {@link Collection#add})
 */
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

size : ArrayList的大小(包含的元素个数)


ensureCapacityInternal(int minCapacity) 方法确保数组容器内部正确 :

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

DEFAULTCAPACITY_EMPTY_ELEMENTDATA为构造ArrayList时的的初始化数组

DEFAULT_CAPACITY=10

minCapacity取10和size+1的最大值


ensureExplicitCapacity(int minCapacity)确保明确容量 :

private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

modCount继承自AbstractList,记录了list在结构上变更的次数.所谓结构变更就是改变List的大小或是因为进程中的迭代导致了错误结果而打乱其顺序.

if判断保证不会溢出


grow(int minCapacity)

/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        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);
    }

若扩充过后的容量小于最少需要的容量,扩充=最少

MAX_ARRAY_SIZE=Integer.MAX_VALUE - 8;//数组能分配的最大值,超出则抛出OutOfMemoryError

如果扩充后的容量大于MAX_ARRAY_SIZE,则返回hugeCapacity(minCapacity);

private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

大容量下,超出int上限返回Integer上限,否则返回Integer上限-8


Arrays.copyOf(elementData, newCapacity)

最后调用

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length)

使用本地接口,在C/C++里完成数组复制扩充

© 著作权归作者所有

共有 人打赏支持
yongzhong
粉丝 17
博文 12
码字总数 3209
作品 0
杭州
程序员
加载中

评论(1)

泥沙砖瓦浆木匠
泥沙砖瓦浆木匠
颜兄继续写写,最近我刚刚看容器那块。
ArrayList (JDK8) 源码解析

ArrayList 源码解析 概述 ArrayList 是一个动态数组,容量可以动态增长。他是线程不安全的,允许元素为null。它的底层数据结构是数组,所以会占用一块连续的内存空间。它实现了 接口。 代表L...

sun_____xin
04/04
0
0
图解Java常用数据结构(一)

最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList LinkedHashMap中的双向...

大道方圆
07/18
0
0
Java之LinkedList源码浅析

LinkedList 优点:插入、删除元素效率高 缺点:遍历数据效率低。 本文基于JDK1.8.131的源码分析(其他版本的源码,不做表述)。 数据结构 底层实现,双向链表 1.构造方法 构造方法以及涉及到...

墨宇hz
06/26
0
0
Java8 ArrayList的源码分析(一)

在Java开发中,最常用的集合莫过于ArrayList, Arraylist 提供了方便的crud的api,看似很复杂,但源码其实很简单,但是jdk1.8与以前版本的方法实现还是有一些不同,下面让我们一起看看ArrayLi...

保安队长
2016/12/06
16
0
Java集合系列--第三篇--ArrayList详细介绍(源码解析

概要 上一章,我们学习了Collection的架构。这一章开始,我们对Collection的具体实现类进行讲解;首先,讲解List,而List中ArrayList又最为常用。因此,本章我们讲解ArrayList。先对ArrayLi...

简心
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中秋快乐!!!

HiBlock
27分钟前
0
0
Node安装教程

1、安装最新版的node 2、设置相关目录(以D盘为例) 分别建立目录:D:\node,D:\node\node-globa,D:\node\node-cache 命令行输入: // 设置npm国内镜像 npm config set registry https://re...

Mohan710
55分钟前
3
0
中国发布域名系统基础软件 “红枫”

9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软件 “红枫(Maple DNS)”。 9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软...

问题终结者
今天
3
0
Shell编程(分发系统介绍、expect远程登录、expect远程执行命令、expect传递参数)

分发系统介绍expect 分发系统expect即分发脚本,是一种脚本语言;通过他可以实现传输,输入命令(上线代码) 应用场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者...

蛋黄_Yolks
今天
2
0
Java Http请求工具类

public static String httpPost(String source, String params) {URL url = null;HttpURLConnection conn = null;OutputStream os = null;String ret = null;try {......

yuewawa
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部