先简单看一下Colleciton的结构:
可以看出,Collection下分三大接口,分别是List、Set、Queue
1.List
- 特点:
按照插入的顺序保存元素,List接口在Collection的基础上添加了大量方法使得程序员可以在List中间插入和移除元素。 - 类别:
- ArrayList 底层是数组,非线程安全,只能用在单线程(多线程请用CopyOnWriteArrayList)
- LinkedList 底层是双向链表
如果插入、删除的操作较多,最好使用LinkedList;如果需要大量的随机访问,最好使用ArrayList。原因在于ArrayList 底层由数组支持,LinkedList 由双向链表实现。
2.Set
- 特点:不保存重复的元素,常用于测试归属性。因此,实现Set接口就要实现equals()方法来保证对象的唯一性,Set本身不保证维护存储顺序。
Set的接口和Collection完全一样,没有其他额外功能,实际上这就是一种继承和多态思想的典型应用——表现不同的行为。 - 类别:
- SortedSet(接口)按照对象的comparator()定义的方法保证处于此种排序
- TreeSet(还继承了SortedSet接口,元素必须实现Comparable接口) 基于红黑树
- HashSet(最常用) 散列函数
- LinkedHashSet 散列查询+链表维护插入顺序
HashSet和HashMap的区别
HashCode的机制
3.Queue
- 特点:Queue是一种满足”先进先出“的容器,即放入的顺序和取出的顺序相同。由于可以可靠地将对象从程序的一个区域传输到另一个区域,因此在并发编程中特别重要。
- 种类:
- LinkedList:虽然名为”List“,但同时也实现了Queue接口
- PriorityQueue:对象会在队列中按照优先级排序(值越小,优先级越高),有最高优先级的将会第一个被取出。
- Deque:双向队列和队列基本相同,但是你可以在任何一端添加或移除元素。
在LinkedList中包含支持双向队列的方法,但是在Java标准类库中没有任何显式的用于双向队列的接口。我们可以使用组合来创建一个Deque类