Collection大纲
我们先来看一幅图:
一下就很清晰了,Collection
接口下存在三个子接口,他们分别是:
Set
、List
、Queue
,有如下定义:
public interface List extends Collection {}
public interface Set extends Collection {}
public interface Queue extends Collection{}
其中Set
、List
、Queue
同级别,都继承了Collection
接口。
1.Set(无序,唯一)
老表且看:
Set接口有三个实现类:HashSet
、LinkedHashSet
、TreeSet
。
1-1.HashSet
底层元素为哈希表
,无序且唯一,利用equals
和hashCode()
方法来保证元素的唯一性。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable{....}
1-2.LinkedHashSet
底层数据结构是链表
和哈希表
,由链表
保证元素有序,由哈希表
保证元素唯一。
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable{....}
1-3.TreeSet
这个有点特殊,因为它不是直接实现的Set
接口,它通过实现SortedSet
接口(SortedSet
继承了Set
接口),间接实现了Set
。
public interface SortedSet<E> extends Set<E>{....}
//========================
public interface NavigableSet<E> extends SortedSet<E>{....}
//========================
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable{....}
这样继承下来,最终只有TreeSet
这一个可用实现类。而且SortedSet
接口只有TreeSet
这一个实现可用其中元素一定是有序的。
2.List(有序,可重复)
老表再看这个:
List
下有三个实现类:ArrayList
、Vector
、LinkedList
2-1.ArrayList
底层数据结构是数组,查询快,增删慢。虽然线程不安全,但是效率高!
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
2-2.LinkedList
底层数据结构是链表,查询慢,增删快。与ArrayList
一样线程不安全,但是效率高。
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
2-3.Vector
Java 1.0
老病友了,远古集合,后续才实现的List接口(刚开始没有实现List)。个人感觉是一个有点过时的集合,Vector
在每个单独的操作上都是同步的,但是它是List
中唯一一个线程安全的,但是效率低下,通常用Vector
的地方用ArrayList
也很好用,二者基本没有什么区别。
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.SerializableP{....}
3.Queue
摊牌了,我没学,我不会👍。但是有一点需要清楚,Queue下面又一个我们都很熟悉的东西:LinkedList
。
这不科学?
LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。
这很科学!
4.如何选用?
还是看图说话(有点丑)
That’s All~