zoukankan      html  css  js  c++  java
  • java集合学习-ArraryList

    上图,画工差,大家随便看看。

    ArrayList

    1.ArrayList是什么?有什么特点

    (1)ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。  

    (2)ArrayList不是线程安全的, ArrayList实现了Serializable接口,因此它支持序列化。

    (3)实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问。

    (4)实现了Cloneable接口,能被克隆

    2.ArrayList实现源码

     2.1构造方法

      很明显ArrayList就是一个数组哈。

    //1-----------------------
    public ArrayList() {
            this(10);
            //调用ArrayList(10) 默认初始化一个大小为10的object数组。
        }
    
    //2-------------------------
    public ArrayList(int initialCapacity) {    
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
             //如果用户初始化大小小于0抛异常,否则新建一个用户初始值大小的object数组。                                      
            this.elementData = new Object[initialCapacity];
        } 
    
    //3--------------------------
    public ArrayList(Collection<? extends E> c) {
            elementData = c.toArray();
            size = elementData.length;
            // 当c.toArray返回的不是object类型的数组时,进行下面转化。
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        }

    2.2 看下add(E e)方法

    //1-----------------------
    public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // 加入元素前检查数组的容量是否足够
            elementData[size++] = e;
            return true;
        }
    //2----------------------- 
    private void ensureCapacityInternal(int minCapacity) {
            modCount++;
            // 如果添加元素后大于当前数组的长度,则进行扩容
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        } 
    //3-----------------------  
    private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            //将数组的长度增加原来数组的一半。
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
                //如果扩充一半后仍然不够,则 newCapacity = minCapacity;minCapacity实际元素的个数。
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
                //数组最大位2^32
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }    

     

  • 相关阅读:
    【leetcode】7. 反转整数
    【leetcode】496. 下一个更大元素 I
    【leetcode】389. 找不同
    Linux驱动模型解析bus之platform bus
    shell 和进程
    递归调用在循环体内: 把循环展开, 这种情况是先循环再递归
    javascript函数柯里化以及柯里化带来的好处
    Maven测试篇
    关于ECharts Java类库的一个jquery插件
    javascript原型链继承
  • 原文地址:https://www.cnblogs.com/qtxx/p/9581328.html
Copyright © 2011-2022 走看看