list和set实现了collection接口;map不是collection的子接口或者实现类,map是相对独立的。
list:1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有ArrayList、LinkedList和Vector。
ArrayList Vector:以数组的方式存储,增、删慢,查、改快
ArrayList:线程不安全,速度快
Vector:线程安全,速度慢(synchoronized)
LikedList: 以链表的方式存储,增、删快,查、改慢
set:1.不允许重复对象。
2.无序容器,你无法保证每个元素的存储顺序。
3.只允许一个null元素。
4.遍历使用迭代器:set.iterator()方法
5.常用的实现类有HashSet,LinkedHashSet和TreeSet。
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
TreeSet:保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列
map:1.map的每个entry都持有两个对象,也就是一个键一个值,map可能会持有相同的值对象但键对象必须唯一。
2.treeMap也通过Comparator或者Comparable维护了一个排序顺序。
3.map里你可以拥有随意个null值但最多只能有一个null键。
4.常用的实现类有HashMap,LinkedHashMap,Hashtable和TreeMap。
HashMap:非线程安全,基于哈希表实现,允许null作为作为key和value,key不可以重复,value可以重复
Hashtable:线程安全,速度较慢
TreeMap:非线程安全,基于红黑二叉树实现,不允许null。
什么场景下使用List、Set、Map呢?
-
如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
-
如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
-
如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
-
如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。