先上两张图展示集合的继承实现关系:

List、Set接口继承树
image.png
Map接口继承图
image.png

Collection

向Collection接口所实现类的对象中添加数据object时,要求所在类重写equals()方法

Collection接口中常用方法:

Collection作为各种集合类型的父接口,其定义了以下一些方法
add(Object obj),addAll(Collection coll),clear(),size(),isEmpty(),remove(),removeAll(),retainsAll(),contains(),containsAll(),equals(),hashCode(),toArray(),iterator()

Collection与数组的相互转换

Collection ->数组

coll.toArray()

数组 ->Collection

调用Arrays类中的静态方法asList()
Arrays.asList(new String[] {"AA","BB","CC"})

迭代器

image.png

List

存储序的可重复的数组,其下有ArrayList,LinkedList,Vector

List的常用方法
image.png
对于两种remove方法,相当于重载

Arraylist

作为List的主要实现类,效率高,是线程不安全的,底层是Object[] elementData存储

源码分析:

jdk7之前,new一个ArrayList对象,底层相当于创建了一个长度为10的数组;
当向数组中添加元素导致超出最大容量时,则扩容,将容量变为原来的1.5倍,并把原有数组中的数据复制到新数组中

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

jdk8中ArrayList的变化:初始化时是初始了一个空数组

 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

当第一次调用add时,才创建了一个长度为10的Object[],相当于懒汉,延迟数组创建,节省了内存
###LinkedLis
对于需要频繁插入删除操作,使用此类效率更高,底层是双向链表
new一个LinkedList时声明了一个Node类型的first和last属性,默认为空;
add将添加元素封装到Node中,创建Node对象
###Vector
作为:List的古老实现类,效率低,是线程安全的,底层是Object[] elementData

Set

无序的,不可重复的
Set中没有额外定义新的方法,使用的都是Collection中声明过的方法
image.png

Hashset与LinkedHashSet

LinkedHashSet作为HashSet的子类,对于要进行频繁遍历操作的集合,使用LinkedHashSet效率更高
底层是HashMap,而HashMap底层jdk7及之前是数组+链表,jdk8之后是链表+数组+红黑树
要求:添加数据时,数据所在的类必须重写equals()和hashCode()方法

public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Persom persom = (Persom) o;

        if (age != persom.age) return false;
        return name.equals(persom.name);
    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }
}

一道例题加深理解:
image.png
最后HashSet中存有4个数据

TreeSet

底层为红黑树
向TreeSet中添加的对象都要求是相同类
自然排序中,重写comparaTo()返回0,不在是equals()
定制排序中,重写compara()

Map

image.png

HashMap在JDK7中的底层实现原理

image.png

HashMap在JDK8中与JDK7中的不同

image.png

Collections工具类

image.png

Q.E.D.