jdk源码解读之ArrayList

直接上源码:

构造函数:

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
    this(10);
    }

其实arrayList的本质是一个数据,只不过这个数组的大小可以变化。我们先来看下arraylist的数组是怎么定义的

    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param   initialCapacity   the initial capacity of the list
     * @exception IllegalArgumentException if the specified initial capacity
     *            is negative
     */
    public ArrayList(int initialCapacity) {
    super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

构造函数直接弄了一个10大小的obj对象数组。

this.elementData = new Object[initialCapacity];

讲到这里我们看下其实只有两个成员变量:

  private static final long serialVersionUID = 8683452581122892189L;

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer.
     */
    private transient Object[] elementData;//元素

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;//list元素数量

看他的核心方法:add

    public boolean add(E e) {
    ensureCapacity(size + 1);  // 添加元素的时候先让数量+1
    elementData[size++] = e;//对应的数组引用放对应的对象
    return true;
    }

这里面有个比较有意思的方法就是这个ensureCapacit这个方法里面有对应的扩展数组的算法:

   public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;//获得最初的数组大小,默认情况下初始值是10
    if (minCapacity > oldCapacity) {//如果比原先的数组元素大了执行如下操作
        Object oldData[] = elementData;//保存原有的数组元素
        //重新new一个数组
        int newCapacity = (oldCapacity * 3)/2 + 1;
            if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            //重新生成一个数组对象并返回,生成的数组对象大小为原先的1.5X+1和minCapacity之间较大的那个
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

jdk源码解读之ArrayList

时间: 2024-10-01 07:30:56

jdk源码解读之ArrayList的相关文章

JDK 源码解读之 ArrayList

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 文档中提到:size isEmpty get set iterator listIterator 操作,是( run in constant time), add操作是(run in amortized constant time),而 其他

JDK源码解读之Integer(1)

本系列文章使用的JDK版本为jdk1.8.0_131,一些基础的知识储备:原码.反码.补码,移位,建议参考文章:<原码,反码,补码 详解><Java 源码学习系列(三)--Integer> Integer是我们开发过程中最常用的一个类,因此JDK的源码解读就从它开始吧.凡是对Java有点了解的都知道,Integer是int的包装类型,长度为32位.因此我们可以看到如下定义 //可表示的最小值:-2^31,至于为什么是这个数,上面的文章讲的很清楚了 @Native public st

【jdk源码分析】ArrayList的size()==0和isEmpty()

先看结果 分析源码 [jdk源码解析]jdk8的ArrayList初始化长度为0 java的基本数据类型默认值 无参构造 size()方法 isEmpty()方法 原文地址:https://www.cnblogs.com/xiaostudy/p/10781148.html

JDK源码分析系列-ArrayList

1.ArrayList本质 数组 + 动态扩容实现的数据列表. private static final Object[] EMPTY_ELEMENTDATA = {}; // elementData初始为空数组 public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; } // 指定初始容量,不能为负数 // 如果能预估集合大小,建议初始化时指定容量,避免扩容,提升性能 public ArrayList(int in

HashTable的故事----Jdk源码解读

HashTable的故事 很早之前,在讲HashMap的时候,我们就说过hash是散列,把...弄碎的意思.hashtable中的hash也是这个意思,而table呢,是指数据表格,也就是说hashtable的本意是指,一份被数据被打散,分散在各处的数据表格. HashTable,作为jdk中,极早提供的容器类(jdk1.0),同时是支持数据并发的类,其在项目中的使用却并不是很广泛.在我所经历的项目中,开发人员往往喜欢使用hashMap然后再通过锁,创造出线程安全的环境.即使是后来推出concu

源码解读:ArrayList源码解析(JDK8)

ArrayList源码解析(JDK8) 更详细的讲解可以参考这篇博文,本文只讲解在阅读源码中个人遇到的问题. 面试必备:ArrayList源码解析(JDK8) 构造函数 /** * ArrayList容器默认初始容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 用于有参构造的空数组 */ private static final Object[] EMPTY_ELEMENTDATA = {}; /** * 用于无参构造的空数组

JDK源码解读之toUnsignedString

我们知道,所有整数都是通过二进制编码的形式存储在内存中的.比如32位的整数,最高位是符号位,0代表正数,1代表负数. 那么怎么才能够将整数的二进制编码形式打印出来呢?Integer类提供了一个公有静态方法toBinaryString能够达到这一目的.我们来看看这段源码: public static String toBinaryString(int i) { return toUnsignedString(i, 1); } /** * Convert the integer to an unsi

JDK源码阅读(一) ArrayList

基于JDK7.0 package java.util; public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; private transient Object

HashSet的故事----Jdk源码解读

Hash,我们在说HashMap的时候,已经知道Hash是散列,Map是映射了. 那么Set又是什么呢 ? 先来看看Set的翻译是什么 n. [数] 集合:一套:布景:[机] 装置 这里Set所取的含义是集合.而且是数学概念上的集合.数学概念上的集合有什么特点呢?那就是Set中所有的元素不能重复.所以HashSet的意思就是以散列的形式维持一套不会有重复元素的集合. 接下来我们看看HashSet是怎么被Jdk实现的吧.(其实逻辑非常简单.) 类的声明: hashSet 继承自AbstractSe