Collection框架集合(1)

发布时间 2023-11-28 22:53:20作者: califorium

Collection

类集设置的目的

普通数组,并不是动态数组,在扩容时候每次是自己进行new一个更大的新的数组,而在实践开发的时候,方便实际Java实现了类集。


类集中的三大接口:Collections,Map,Iterator。
所有的类集合都在java.util包中。

Collection接口

Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据


def:采用泛型技术

public interface Collection<E> extends Iterable<E>;
常用方法

public boolean add(E e);
//return无论如何只有ture
public Iterator<E> 

List

ArrayList,Vecter,LinkList(链表结构)

ArrayList

ArrayList:使用泛型数组结构,对于增加删除操作快,查找慢

ArrayList<Integer> data=new ArrayList

构造方法

构造器 描述
ArrayList() 构造一个初始容量为10的空列表。
ArrayList​(int initialCapacity) 构造具有指定初始容量的空列表。
ArrayList​(Collection<? extends E> c) 按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。

每次扩容为原始的1.5倍,若需要极大的空间,需要在初始化时候进行声明

ArrayList的内部原理

首先我们来看一下它的定义

public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

传入一个默认的数组,而private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};显然是一个空数组
所以ArrayList在构造开始是一个空数组,但是jdk里面说是10个长度,为什么呢
当我们在添加元素时候看一看add方法的定义

public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }

首先modCount记录修改的次数,然后使用add方法,它接受三个参数:要添加的元素e,集合的元素数据数组elementData,以及集合数组大小size
进一步的我们在看一下此处的add定义

    private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }

如果当前的size,s已经等于了数组的长度则进行grow扩容
所以我们来看一下grow的定义

 private Object[] grow() {
        return grow(minCapacity:size + 1);
    }

再来看看此处的grow的具体逻辑

 private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }

首先定义了一一个原数组的长度由于扩容1.5倍首先就得排除初始的为空或者只有1的情况如何创建一个新的更大数组copy过来

Vector

Vector是同步的,如果不需要线程安全建议使用ArraysList
每次扩容的数量是可以定义的

LinkedList

Linkedlist:使用的双向链表
可以实现队列和栈