文档章节

JDK源码阅读ArrayList

le284
 le284
发布于 2015/02/13 14:57
字数 478
阅读 378
收藏 4

#ArrayList的具体实现

ArrayList是List接口的具体实现,是在实际生产环境中用的非常多的一种工具类

##数据结构

  1. 顾名思义,从ArrayList的名字中我们就可以看出,ArrayList是基于数组的一种实现.
private transient Object[] elementData; //对象存储
private int size; //实际含有对象的大小  size <= elementData.length

##主要代码实现

构造函数

	// 构造函数比较简单, 初始化对象数组就可以了
	public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity]; 
    }

add

	//将对象添加到数组的末尾即可
	public boolean add(E e) {
        ensureCapacityInternal(size + 1);  //对List进行扩容
        elementData[size++] = e;
        return true;
    }
	//在index位置添加新的数据, >=index的则全部后移一位
	public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // 扩容
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index); // 后移
        elementData[index] = element;
        size++;
    }
	
	//扩容实现
	private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); // 计算扩容后的数组大小 JDK > 1.7的算法, 与1.7以前的算法不同
        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);
    }

set

	//替换index的原有数据
	public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

get

	//直接取值, 数组结构的最大优势
	E elementData(int index) {
        return (E) elementData[index];
    }

remove

	//根据index remove
	public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
	//根据Object  remove
	public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

其余函数基本与这几个类似

迭代器, TODO:暂时还没看太明白,改天继续分析

© 著作权归作者所有

共有 人打赏支持
le284
粉丝 14
博文 19
码字总数 13774
作品 0
威海
程序员
私信 提问
LinkedList VS ArrayList

List,根据名字我们知道是有序的元素集合。先贴一张集合的关系图。这里我们分析LinkedList与ArrayList。 Collection结构 LinkedList与ArrayList 它们都实现了List接口。但是内部实现上有些区...

Real_man
2018/03/21
0
0
jdk源码阅读笔记-ArrayList

一、ArrayList概述 首先我们来说一下ArrayList是什么?它解决了什么问题?ArrayList其实是一个数组,但是有区别于一般的数组,它是一个可以动态改变大小的动态数组。ArrayList的关键特性也是...

编程SHA
2018/11/11
0
0
深入JDK源码_Index

深入JDK源码 深入JDK源码之定时操作Timer类和TimerTask类实现 深入JDK源码之Observer接口和Observable类实现观察者模式 深入JDK源码之集合类图 深入JDK源码之ArrayList类 深入JDK源码之Linke...

陶邦仁
2016/04/23
1K
0
jdk1.6的集合源码阅读之ArrayList

简述 ArrayList其实就是动态数组,是Array的复杂版本,动态扩容和缩容,灵活的设置数组的大小,等等。 其定义如下 而AbstractCollection实现了Collection的部分方法和AbstractList继承了该A...

双月通天
2016/08/23
18
0
Arrays.asList回来的List与new ArrayList的区别

转自: http://www.myexception.cn/program/1351095.html 前几天写代码的时候用到将Set转换为List然后继续进行操作,向里面添加元素的时候报错了,代码逻辑类似下面: import java.util.Arr...

moreThink
2016/04/08
105
0

没有更多内容

加载失败,请刷新页面

加载更多

https

进入阿里云域名后台,修改DNS为阿里云官方DNS(默认为官方),然后点击“免费开启SSL证书” 点击“申请”、“验证”并等待签发 然后根据自己的服务器类型下载对应的证书 我使用的是lnmpa工具...

临江仙卜算子
14分钟前
0
0
Quartz监听器Listerner

概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知。Quartz监听器主要有JobListener、TriggerListener、SchedulerListener三种,顾名思义,分别表示任务、...

大笨象会跳舞吧
41分钟前
3
0
Call exception, tries=10, retries=35, started=38348 ms ago, cancelled=false, msg=pc-node1 row

写hbase的问题,2019-01-18 23:23:28,082 | INFO | [hconnection-0x6431d54d-shared--pool2-t5] | Call exception, tries=10, retries=35, started=38348 ms ago, cancelled=false, msg=p......

stys35
45分钟前
2
0
docker 安装portainer、gogs、redis、mongodb、es、rabbitmq、mysql、jenkins、harbor

1、准备三台虚拟机ip如下 编号 Ip 1 192.168.100.101 2 192.168.100.102 3 192.168.100.103 2、镜像应用编排 192.168.100.101 主要安装系统运维相关服务 192.168.100.102 主要安装mysql、mon...

北岩
54分钟前
7
0
storm 提交任务报SocketException错误及解决办法

提交任务爆错: org.apache.storm.thrift.transport.TTransportException: java.net.SocketException: Broken pipe (Write failed) ..... Caused by: org.apache.storm.thrift.transport.TTr......

jingshishengxu
59分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部