文档章节

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

yongzhong
 yongzhong
发布于 2015/02/04 22:16
字数 427
阅读 419
收藏 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之LinkedList源码浅析

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

墨宇hz
06/26
0
0
几张动态图捋清Java常用数据结构及其设计原理

  点击上方“java进阶架构师”,选择右上角“置顶公众号”   20大进阶架构专题每日送达   进阶架构精品专题   Mysql优化专题(★★★★)   网络协议专题(★★★★)   其余18大...

java进阶架构师
11/14
0
0
图解Java常用数据结构(一)

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

大道方圆
07/18
0
0
Java8 ArrayList的源码分析(一)

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

保安队长
2016/12/06
16
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
EOS错误代码及中文释义

本文集汇总了EOS区块链常见错误代码及其含义,完整错误代码集请查看 EOS错误代码集 - 汇智网 EOS错误代码列表如下, <table class="table table-striped"> <thead> <tr><th>错误代码</th><t......

汇智网教程
昨天
4
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
5
0
kiss原则

KISS 原则是用户体验的高层境界,简单地理解这句话,就是要把一个产品做得连白痴都会用,因而也被称为“懒人原则”。换句话说来,”简单就是美“。KISS 原则源于 David Mamet(大卫马梅)的电...

NB-One
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部