• ArrayList


    ArrayList

    java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。  

    ArrayList 中可不断添加元素,其大小也自动增长。
    ArrayList集合的特点
      底层是数组实现的,长度可以变化
    泛型的使用   用于约束集合中存储元素的数据类型

    构造方法

    ArrayList的构造函数总共有三个:
    
    (1)ArrayList()构造一个初始容量为 10 的空列表。
    
    (2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
    
    (3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。

    使用泛型与不使用泛型有什么区别

    List lists=new ArrayList();
    List<String> lists=new ArrayList<String>();
    从list中取出的值不一样,
    第一种的话取出来是object类型的,需要强制类型转换,
    而第二个不用,取出来之后直接就是string类型的

    常用方法

    //方法名 说明
    public boolean remove(Object o) 删除指定的元素,返回删除是否成功
    public E remove(int index) 删除指定索引处的元素,返回被删除的元素
    public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
    public E get(int index) 返回指定索引处的元素
    public int size() 返回集合中的元素的个数
    public boolean add(E e) 将指定的元素追加到此集合的末尾
    public void add(int index,E element) 在此集合中的指定位置插入指定的元素

    实现可变长度

    建ArrayList对象时,ArrayList有个带参数的构造函数,那个参数的意思就代表着ArrayList长度,默认情况是10。当数据多了,ArrayList容不下时,这时ArrayList会增加长度,newLength = oldLength + oldLength/2;如果初始值是10,那么依次是15,22,33,49,73.....
    .,长度是增加了,那是怎样实现的呢?当数据容不下时,ArrayList会再创建一个更大的数组,数组长度为之前所说的那样,然后将之前的数据拷贝到新数组中。这就是ArrayList基于数组实现的可变长度原理。

    添加操作,首先会调用ensureCapacityInternal(size + 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。
    
    public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
    
    
    在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensureExplicitCapacity()。
    
     private void ensureCapacityInternal(int minCapacity) {
            if (elementData == EMPTY_ELEMENTDATA) {
                minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
            }
     
            ensureExplicitCapacity(minCapacity);
        }
     
        private void ensureExplicitCapacity(int minCapacity) {
            modCount++;
     
            // overflow-conscious code
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
    
    
    
    如果数组长度小于默认的容量10,则调用扩大数组大小的方法grow()。
        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);
    }

    从内部实现机制来讲ArrayList是使用数组(Array)来控制集合中的对象。当你增加元素的时候,如果元素的数目超出了内部数组目前的长度,它需要扩展内部数组的长度,ArrayList是原来的50%,即newCapacity = oldCapacity+(oldCapacity/2)

  • 相关阅读:
    Java基础系列——IO流
    如何为网站添加 CSS 暗模式(转载)
    详解 UWP (通用 Windows 平台) 中的两种 HttpClient API
    微软微服务架构 eShopOnContainers
    web开发中使用html/css全屏铺开显示
    web开发中的Cookie
    WPF依赖属性Binding实现
    SQL Server2014安装流程及注意事项
    .Net配置文件读取及修改方法封装(未加密)
    WCF开发优秀博客园推荐
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13024106.html
Copyright © 2020-2023  润新知