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);
        }    

     

  • 相关阅读:
    dubbo源码阅读-服务订阅(八)之本地订阅(injvm)
    dubbo源码阅读-服务订阅(八)之主流程
    dubbo源码阅读-服务暴露(七)之远程暴露(dubbo)
    dubbo源码阅读-配置(二)之API配置
    dubbo源码阅读-容器启动(六)
    LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]
    LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
    LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
    智能电视大战背后的秘密
    二线视频网站突围战
  • 原文地址:https://www.cnblogs.com/qtxx/p/9581328.html
Copyright © 2011-2022 走看看