文档章节

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

yongzhong
 yongzhong
发布于 2015/02/04 22:16
字数 427
阅读 397
收藏 3
点赞 0
评论 1


/**
 * 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

Java之LinkedList源码浅析

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

墨宇hz ⋅ 2017/12/07 ⋅ 0

Java8 ArrayList的源码分析(一)

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

保安队长 ⋅ 2016/12/06 ⋅ 0

Hadoop学习笔记7: 0.1.0的conf学习

0.1.0文件分析 类的关系图 Configurable【接口】 public interface Configurable { void setConf(Configuration conf); //一个接口函数方法,设置配置对象 Configuration getConf(); //一个接...

强子哥哥 ⋅ 2014/08/07 ⋅ 0

Java 集合系列: ArrayList详细介绍(源码解析)和使用示例

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

sihailoveyan ⋅ 05/08 ⋅ 0

lucene2.4 学习笔记1

网站要用搜索功能,本来想用SQL语句来实现,后来感觉没什么意思,并开始考虑用LUCENE,去官网下载了2.9的版本,发现新东西比较多,于时下载了 2.4版本.相比以前的版本有些变化。 首先建立Ind...

asdtiang ⋅ 2010/02/22 ⋅ 0

dubbo源码学习笔记----container

Main函数启动 启动时会装载扩展: 做了一个Jvm的ShutdownHook,在JVM退出时做一些清理工作: Spring作为容器 Jetty容器

春哥大魔王的博客 ⋅ 01/14 ⋅ 0

ArrayList和LinkedList学习

ArrayList和LinkedList学习 1.ArrayList 1.1源码分析 //默认数组容量即长度为10private static final int DEFAULT_CAPACITY = 10; //存储对象数组transient Object[] elementData; //数组长度......

战地春梦 ⋅ 2016/07/15 ⋅ 0

ArrayList 和 HaspMap 链式添加的实现

一、背景 在application中ArrayList 和 HaspMap 这两个类是经常用到的。而且,一般需要处理的数据量也不会少,因为这两个类是没有实现链式添加元素的,因此我们需要不断重复的编写这两个类声...

_魔术师_ ⋅ 2013/11/13 ⋅ 0

ArrayList中subList实现

首先来看一个例子: 运行结果:[1, 2, 3, 4][2, 3][5, 3][1, 5, 3, 4] 由结果可推出:bList修改时,aList中的元素也将会修改。 下面来看一下ArrayList中subList的实现: subListRangeCheck只...

Antin_zhu ⋅ 2016/07/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 10分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 10分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 16分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 16分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 17分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 23分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 28分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 30分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 46分钟前 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 54分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部