zoukankan      html  css  js  c++  java
  • 集合类 collection接口 ArrayList

    数组: 存储同一种数据类型的集合容器.
    数组的特点:
    1. 只能存储同一种数据类型的数据。
    2. 一旦初始化,长度固定。 
    3. 数组中的元素与元素之间的内存地址是连续的。
      : Object类型的数组可以存储任意类型的数据。


    集合:集合是存储对象数据的集合容器。
    集合比数组的优势:
    1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型 的数据。
    2. 集合的长度是会发生变化的,数组的长度是固定的。

    Collection接口提供的方法:

    forEach()默认实现:

        default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }

     Spliterator<T> spliterator() 默认实现:

        default Spliterator<T> spliterator() {
            return Spliterators.spliteratorUnknownSize(iterator(), 0);
        }

    提供的实现类继承关系如下:

    ------------| Collection 单例集合的根接口
    ----------------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复。 
    -------------------| ArrayList  ArrayList 底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。
    -------------------| LinkedList LinkedList 底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快。
    -------------------| Vector(了解即可)  底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。


    ----------------| Set  如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。
    -------------------| HashSet  底层是使用了哈希表来支持的,特点: 存取速度快. 
    -------------------| TreeSet   如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。

    ArrayList  

    ArrayList  继承关系如下:

    RandomAccess为标记接口,表明for循环比Iterator迭代器循环具有更高的性能
    List接口新增方法为:
    • boolean addAll(int index, Collection<? extends E> c);
    • E get(int index);
    • E set(int index, E element);
    • void add(int index, E element);
    • E remove(int index);
    • int indexOf(Object o);
    • int lastIndexOf(Object o);
    • ListIterator<E> listIterator();
    • ListIterator<E> listIterator(int index);
    • List<E> subList(int fromIndex, int toIndex);

    新增接口主要和List有关的随机访问有关系

    ArrayList底层实现为Object数组,这也是泛型在数组上的缺陷,只能维护一个Object类型的数组。

    扩容:首次初始化数组length为10,通常为1.5倍扩容,

          elementData = Arrays.copyOf(elementData, newCapacity);完成扩容和数组内容复制

    会有系统调用的add操作:

        public void add(int index, E element) {
            rangeCheckForAdd(index);
    
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            System.arraycopy(elementData, index, elementData, index + 1,
                             size - index);
            elementData[index] = element;
            size++;
        }
    
        public boolean addAll(int index, Collection<? extends E> c) {
            rangeCheckForAdd(index);
    
            Object[] a = c.toArray();
            int numNew = a.length;
            ensureCapacityInternal(size + numNew);  // Increments modCount
    
            int numMoved = size - index;
            if (numMoved > 0)
                System.arraycopy(elementData, index, elementData, index + numNew,
                                 numMoved);
    
            System.arraycopy(a, 0, elementData, index, numNew);
            size += numNew;
            return numNew != 0;
        }
    
        public Object[] toArray() {
            return Arrays.copyOf(elementData, size);
            
        }    

    所有Collection具有公共的父接口Iterable,Iterable接口提供如下三个方法:

    其中iterator()方法返回一个Iterator类型的对象,Iterator包含四个方法,支持快速失败

     Iterator构造方法:

    int cursor;       // index of next element to return
            int lastRet = -1; // index of last element returned; -1 if no such
            int expectedModCount = modCount; // 任何修改列表的行为都将导致modCount变化从而跌倒失败

    ListItr extends Itr:

            ListItr(int index) {
                super();
                cursor = index;
            }
  • 相关阅读:
    BZOJ4569 : [Scoi2016]萌萌哒
    2016浙江省赛过山车记
    BZOJ4546(原) : 三元组
    BZOJ4539 : [Hnoi2016]树
    BZOJ4537 : [Hnoi2016]最小公倍数
    BZOJ4538 : [Hnoi2016]网络
    BZOJ4527 : K-D-Sequence
    BZOJ4504 : K个串
    BZOJ4471 : 随机数生成器Ⅱ
    BZOJ3659 : Which Dreamed It
  • 原文地址:https://www.cnblogs.com/heapStark/p/8168728.html
Copyright © 2011-2022 走看看