集合:

集合,集合是java中提供的一种容器,可以用来存储多个数据。集合的长度是可变的,集合中存储的元素必须是引用类型数据。

集合继承关系图:

        

List:

         List是一个接口,继承自Collection,除了有Collection的方法以外,又有多的属于自己的方法,比如add()、remove()等等。

public static void function(){
        List<String> list = new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");
        System.out.println(list);
        
        list.add(1, "itcast");
        System.out.println(list);
      }
public static void function_1(){
        List<Double> list = new ArrayList<Double>();
        list.add(1.1);
        list.add(1.2);
        list.add(1.3);
        list.add(1.4);
        
        Double d = list.remove(0);
        System.out.println(d);
        System.out.println(list);
      }

                              

ArrayList:

首先说一下ArrayList类,查看ArrayList类源码发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口,还实现了接口Serializable,可序列化的对象,底层采用的是数组结构(把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化)。

指定了序列化UID,还把ArrayList的默认长度指定为10。

                        

三个构造函数,空参数是一个默认为10长度的列表;也可以放入一个集合作为它的一个元素;也可以初始化指定它的大小的空列表;那么我们看看他们是怎么添加元素和删除元素的。

Add方法:

无论是指定索引插入还是尾部插入,首先确保是否是有足够的空间可以插入,如果有就直接插入元素。

如果没有足够空间,那么是如何扩充的呢?

注意此处扩充capacity的方式是将其向右一位再加上原来的数,实际上是扩充了1.5倍,再和minCapacity比较,如果还是不够,就把size扩充至minCapacity。如果是队尾插入就可以直接添加了。

Indexof方法:

这个方法是实现查找参数的索引,看源码,如果传入的是null,那么返回-1,如果不是空在判断是不是在队列里,如果在,返回相应的位置,如果不在,返回-1。

Remove方法:

Remove方法有两种删除,参数是指定索引和参数是对象两种形式。

1、参数是指定索引,首先判断索引是否存在,如果不存在就会报边界溢出异常,如果在数组范围内,就把index之后的数据整体向前移动一位,最后一位值清空。

2、如果传入的是一个对象,就会进行一次indexOf的操作根据返回值判断是否存在,如果存在就调用fastRemove方法删除掉元素,如果不存在,则返回false。

Get方法:

首先判断输入索引是否越界,如果不越界的话,返回该索引上的元素。

Set方法:

判断输入索引是否越界,如果越界抛出异常,如果不越界,就把需要修改的值传给该索引,同时返回该索引以前的值。

LinkedList:

底层采用链表结构,还是一个双向链表,每次查询都要从链头或链尾找起,查询相对数组较慢但是删除直接修改元素记录的地址值即可,不需要大量移动元素。LinkedList的索引决定是从链头开始找还是从链尾开始找,如果该元素小于元素长度一半,从链头开始找起,如果大于元素长度的一半,则从链尾找起。

Add()方法:

1、插入是在尾部插入,把newNode的前面节点执行现在的尾部节点,newNode的后面节点执行null,因为是在尾部,所以把现在的尾部节点的后面节点指向newNode,因为现在的尾部节点不是最后一个了。

2、不在尾部插入,假设现在在6号位插入一个newNode

就是通过现在的6号Node的prev找到5号节点,然后修改5号节点的next,指向nowNode,然后nowNode的prev指向5号节点,next指向6号节点,最后6号节点的prev变成了nowNode,next不变。

IndexOf方法:

判断是否为空,如果为空,返回-1并结束;如果不为空,从首节点开始,逐个向后比较,找到后返回自己的索引。

Remove方法:

无参数,默认删除头结点。把头节点的值清空,next清空,然后把nextNode只为头节点,然后清空next的prev,最后size减1。

如果是不是空参数,首先判断Index对应的节点是否为头节点,即index是否为0,如果不是中间节点,就是x的prev指向x的next;如果是中间节点,就把index的节点的next的pre只想next的pre,把next的pre的next指向index的next,删掉index即可。

            

Vector:

Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合,它是线程同步的Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。