目录
0 集合
集合存放的都是对象,即引用数据类型,基础数据类型不能放到集合中。
-
List,Set,Map都是接口,前两个继承至Collection接口,Map为独立接口
-
List下有ArrayList、Vector、LinkedList
-
Set下有HashSet、LinkedHashSet、TreeSet
-
Map下有Hashtable、LingkedHashMap、HashMap、TreeMap
-
Collection接口下还有个Queue接口,有PriorityQueue类。
1 List集合 -有序,可重复
list集合中的元素是有序的,不关心是否重复。通过序号访问。
list接口有 ArrayList(基于动态数组数据结构的实现),LinkedList(基于链表数据结构的实现),Vector
List list = new ArrayList();
-
ArrayList:基于动态数组数据结构的实现,底层使⽤ Object[ ]存储,适⽤于频繁的查找⼯作,线程不安全。
优点:底层数据结构是数组,查询快,增删慢。
缺点:线程不安全,效率高。
-
LinkedList:基于链表数据结构的实现
优点:底层数据结构是链表,查询慢,增删块。
缺点:线程不安全,效率高。
-
Vector:是 List 的古⽼实现类,底层使⽤ Object[ ]存储,线程安全的。
优点:底层数据结构是数组,查询快,增删慢。
缺点:线程安全,效率低。
遍历List集合三种方法:
-
for循环遍历
-
for-each循环遍历
-
迭代器遍历,Iterator和ListIterator迭代器。
2 Set集合 -无序,不可重复
Set集合是有一串无序的,不能重复的相同类型元素构成的集合。不能通过类似list集合的序号访问。
set接口直接实现类是HashSet,HashSet是基散列表数据结构的实现。
- HashSet(无序,唯一):基于基散列表数据结构HashMap实现的,低层采用HashMap来保存元素
- LinkedHashSet:LinkedHashSet是HashSet的子类,并且其内部是通过LinkedHashMap来实现的。
- TreeSet(有序,唯一):红黑树实现(自平衡的排序二叉树)
-
HashSet
底层数据结构是哈希表。(无序,唯一)
1. 如何来保证元素唯一性?
答:依赖两个方法:HashCode() 和equals()
- LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1. 如何来保证元素有序性?
答: 由链表保证元素有序
2. 如何来保证元素唯一性?
答:由哈希表保证元素唯一
-
TreeSet
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序
2. 如何保证元素唯一性的呢?
答:根据比较的返回值是否为0来决定。
用途:
-
TreeSet主要功能用于排序
-
LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
-
HashSet只是通过的存储数据的集合。
遍历Set集合三种方法:
-
for-each循环遍历
-
迭代器遍历
3 Map集合 -key不重复,value可重复
Map(映射)允许按照某个键来访问元素。Map集合由两个集合构成,一个是键(key)集合,键集合是Set集合,所以不能有重复的元素;一个是值(value)集合,是Collection类型,可以有重复的元素。
- HashMap:jdk1.8之前,HashMap由 数组+链表 实现,数组是HashMap的主体,链表是主要为了解决哈希冲突而存在的。jdk1.8之后,以红黑树 实现。
- LinkedHashMap:LinkedHashMap继承HashMap,所以低层仍然是基于拉链式散列结构 即 由数组和链表 或 红黑树 组成。在此基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
- TreeMap:红黑树(自平衡的排序二叉树)
Map接口直接实现类主要是 HashMap,HashMap是基散列表数据结构的实现。
Map集合 | key | value |
---|---|---|
HashMap | 允许为null | 允许为null |
TreeMap | 不允许为null | 允许为null |
ConcurrentMap | 不允许为null | 不允许为null |
HashTable | 不允许为null | 不允许为null |
Map接口有三个比较重要的实现类,HashMap、TreeMap、HashTable(哈希表)。
-
TreeMap是有序的,HashMap和HashTable是无序的。
-
HashTable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
这就意味着:
-
HashTable是线程安全的,HashMap不是线程安全的。
-
HashMap效率较高,HashTable效率较低。
-
HashTable不允许null值,HashMap允许null值(key和value都可)
-
父类不同:HashTable的父类是Dictionary,HashMap的父类是AbstractMap。
针对Collection集合我们到底使用谁呢?
唯一吗?
是:Set
排序吗?
是:TreeSet或LinkedHashSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
否:List
要安全吗?
是:Vector
否:ArrayList或LinkedList
查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArraySet。
4 常见问题
4.1 list set map区别
① list 集合中的元素是有序的,可以有重复的,通过序号访问。list接口的实现类有ArrayList、LinkedList等。其中ArrayList和LinkedList是线程不安全的,Vector是线程安全的。
② set集合是的元素是无序的,不能重复的,不能通过类似list集合的序号来访问。set接口实现类有HashSet、LinkedHashSet、TreeSet。
③ Map集合由两个集合构成,一个是键(key)集合,键集合是Set集合,所以不能有重复的元素;一个是值(value)集合,是Collection类型,可以有重复的元素。Map(映射)允许按照某个键来访问元素。map实现类有HashMap、TreeMap、Hashtable等。
4.2 Arraylist与Linkedlist区别
① ArrayList底层数据结构是数组,查询快,增删慢。
② LinkedList底层数据结构是链表,查询慢,增删块。
③ 它们都是线程不安全的。
4.3 hashmap 和 treemap区别
① HashMap是无序的,TreeMap是有序的;
② HashMap的key和value都允许为null,TreeMap的key不允许为null;