简单的来讲,集合和列表最大的区别就是集合无序、不可重复;而列表有序、可以重复。即继承list接口是有序可重复,继承set接口是无序不重复。
Collection 接口(类名和特性可能不一样,但是用法是一样的)
List 接口
- ArrayList:非线程安全,底层数据结构为数组,有序,可重复,可为 null,最多可以有 Integer.MAX_VALUE 个 null 元素;
- LinkedList:非线程安全,底层数据结构为双向链表,有序,可重复,可为 null,最多可以有 Integer.MAX_VALUE 个 null 元素;
- Vector:线程安全,底层数据结构为数组,有序,可重复,可为 null,最多可以有 Integer.MAX_VALUE 个 null 元素。
Set 接口(类名和特性可能不一样,但是用法是一样的)
- HashSet:非线程安全,底层数据结构为哈希表,无序,不可重复,可为 null,最多可以有一个 null 元素;
- LinkedHashSet:非线程安全,底层数据结构为哈希表和双向链表,有序,不可重复,可为 null,最多可以有一个 null 元素;
- TreeSet:非线程安全,底层数据结构为红黑树,有序,不可重复,不可为 null;
Queue 接口
- PriorityQueue:非线程安全,底层数据结构为堆,无序,不可重复,不可为 null;
- ArrayDeque:非线程安全,底层数据结构为动态数组,有序,可重复,可为 null,最多可以有 Integer.MAX_VALUE 个 null 元素。
Map 接口(类名和特性可能不一样,但是用法是一样的)
- HashMap:非线程安全,底层数据结构为哈希表,无序,key 不可重复,key 和 value 都可为 null,最多可以有一个 key 和多个 value 为 null 的元素;
- TreeMap:非线程安全,底层数据结构为红黑树,有序,key 不可重复,key 不可为 null,value 可为 null;
- LinkedHashMap:非线程安全,底层数据结构为哈希表和双向链表,有序,key 不可重复,key 和 value 都可为 null,最多可以有一个 key 和多个 value 为 null 的元素;
- ConcurrentHashMap:线程安全,底层数据结构为哈希表和分段锁,无序,key 不可重复,key 和 value 都不可为 null;
- Hashtable:线程安全,底层数据结构为哈希表,无序,key 不可重复,key 和 value 都不可为 null;
Iterator 接口
集合的for循环或增强for期间不能删除数据(删除后长度小了,会超出索引),但是可以使用迭代器进行删除元素。
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); if (element.equals("B")) { iterator.remove(); // 删除元素 "B" } }
// 使用迭代器遍历 Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); String key = entry.getKey(); Integer value = entry.getValue(); // 执行操作 } // 使用增强型 for 循环遍历 for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); // 执行操作 }
map的线程安全都不允许key和value为null,hashmap排序不允许key为null。