一、List
有序可重复
ArrayList有序可重复,查询快,增删慢,线程不安全,效率高,底层是数组;
LinkedList有序可重复,增删快,查询慢,线程不安全,效率高,底层是链表;
Vector有序可重复,查询快,增删慢,线程安全,效率低,底层是数组。
二、set
无序唯一
HashSet无序唯一,底层是哈希表,依靠hashCode()和equals()保证元素唯一;
LinkedHashSet插入有序唯一,底层是链表和哈希表,链表保证按插入有序,哈希表保证唯一;
TreeSet有序唯一,底层是红黑树,由自然排序和比较器排序保证元素有序排序,有比较的返回值是否是0来决定元素唯一。
HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则。
HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException。
HashSet 、 LinkHashSet 、 TreeSet 都不是线程安全的;如果要使用线程安全可以Collections.synchronizedSet()。
三、Map
HashMap 无序 线程不安全
TreeMap 有序 线程不安全
HashTable 无序 线程安全
CurrentHashMap 无序 线程安全
查看Hashtable的源代码可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有synchronized关键字,而HashMap的源码中则没有。
Hashtable不允许null值,HashMap允许null值(key和value都允许)。
Hashtable的父类是Dictionary,HashMap的父类是AbstractMap