普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充大小,所以最早的时候可以通过链表实现一个动态对象数组。但是这样做毕竟太复杂了,所以在 Java 中为了方便用户操作各个数据结构,所以引入了类集的概念,有时候就可以把类集称为 java 对数据结构的实现。
csdn里面已经有人写了详细的java集合类的思维导图,这里给出了链接,大家可以直接过去访问,点击这里。
一、 Collection接口
Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据。
上面是Collection类中定义的15种方法,此接口的全部子类或子接口就将全部继承以上接口中的方法。
Collection中有两个子接口,分别是List和Set接口,下面一一介绍。
二、List接口
List 是 Collection 的子接口,里面的所有内容都是允许重复的。
除了继承Collection接口的方法外,List接口另外新增了如上的几种方法。但是List仍然是一个接口,要想具体的使用这些方法,我们还要了解一下List接口的实现类。
List的常用实现类有ArrayList、Vector类、linkedList类三种。这三个类的作用大同小异,了解其各有的特性及优点才是需要关注的内容。
2.1 ArrayList类
ArrayList类是集合类中最常用的,其底层仍然是操作的数组,这也就决定了其增删慢,查找快的特性,适合随机查找与遍历,但不适合于经常用到插入和删除的操作。允许有Null元素存在。
下面展示了ArrayList类的常用方法。
| No. | 方法 | 类型 | 描述 |
|---|---|---|---|
| 1 | public void add(int index,E element) | 普通 | 在指定索引处添加元素 |
| 2 | public boolean add(E element) | 普通 | 向集合末尾添加元素,注意返回的一定是true |
| 3 | public boolean contains(Object o) | 普通 | 判断集合是否包含某元素 |
| 4 | public E get(int index) | 普通 | 获取指定索引处的内容并返回 |
| 5 | public E get(int index) | 普通 | 获取指定索引处的内容并返回 |
| 6 | public int indexOf(Object o) | 普通 | 返回指定元素第一次出现的索引,如果没有则返回-1 |
| 7 | public int size() | 普通 | 获取此集合的长度,遍历数组会用到 |
| 8 | public boolean remove(Object o) | 普通 | 删除指定元素(如果存在) |
| 9 | public Object[] toArray(Object o) | 普通 | 以从前往后顺序返回一个包含此列表中所有元素的数组 |
| 10 | public void trimToSize(int length) | 普通 | 修改这个 ArrayList实例的容量是列表的当前大小。 |
2.2 Vector类
Vector类与ArrayList类具有相同的成员方法,从Java 2平台v1.2开始,该类改进了List接口,使其成为Java Collections framework的成员。 与新的集合实现不同,Vector被同步。 如果需要线程安全的实现,建议使用Vector代替 ArrayList。
下表展示了两者的区别。
2.3 linkedList类
linkedList类是双链表结构,实现了List和Queue接口,允许存储所有元素(包括null )。
由于其使用链表结构存储结构,适合所以有增删快,查找慢的特性。需要注意的是,linkedList类不支持同步,多线程使用的情况向也会出现线程不安全的问题。
上图是Queue接口的方法,由于linkedList类实现了此接口,也具有上面的方法。
总结:
ArrayList:
1. 底层数据结构是数组,查询快、增删慢
2. 线程不安全,效率高
Vector:
1. 底层数据结构是数组,查询快,增删慢
2. 线程安全,效率底
linkedList:
1. 底层数据结构是链表,查询慢,增删快
2. 线程不安全,效率高



