java集合分类
Java集合大致可以分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合,Java 5 又增加了Queue体系集合,代表一种队列集合实现。Java集合就像一种容器,存放的是对象的引用
集合和数组
数组长度不可变,集合只能存放对象
List
- List有序、可重复,遍历方法很多
- ArrayList
数组结构,查询快,增删慢。
线程不安全,效率高 - LinkedList
链表结构,查询慢,增删快。
线程不安全,效率高 - Vector
数组结构,查询快,增删慢。
线程安全,效率低
Set
- Set无序、不可重复
需要hashCode()和equals()实现不可重复
只能使用迭代器遍历 - HashSet
哈希表结构
无序,不可重复
需要实现hashCode()和equals()实现不可重复 - LinkedHashSet
插入遍历顺序一致
链表和哈希表结构
FIFO插入有序,唯一
由链表保证元素有序
需要hashCode()和equals()实现不可重复 - TreeSet
红黑树结构,有序
自然排序
比较器排序
不可重复根据比较的返回值是否是0来决定(compareTo)
Queue
- Queue用于模拟队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
- 阻塞方法 take put
- 双向、单向
- LinkedList
阻塞、非线程安全、无边界 - PriorityQueue
非阻塞、非线程安全、无边界
支持优先级队列实现类。 - ConcurrentLinkedQueue
非阻塞、线程安全、无边界
基于链接节点的队列实现类。 - ArrayBlockingQueue
阻塞、线程安全、有边界,
创建的时候指定大小,一旦创建容量不可改变实现类
默认是不保证线程的公平性,不允许向队列中插入null元素。 - LinkedBlockingQueue
阻塞、线程安全、可选有边界,
一个由链表结构组成的可选有界阻塞队列实现类,如果未指定容量,那么容量将等于Integer.MAX_VALUE。 - PriorityBlockingQueue
阻塞、线程安全、无边界,
支持优先级排序的无边界阻塞队列实现类。 - DelayQueue
阻塞、线程安全、无边界,
使用优先级队列实现的无界阻塞队列实现类,只有在延迟期满时才能从中提取元素。 - SynchronousQueue
阻塞、线程安全、无数据队列,不存储元素、没有内部容量的阻塞队列实现类。 - LinkedBlockingDeque
阻塞、线程安全、无边界,由链表结构组成的可选范围双向阻塞队列实现类,如果未指定容量,那么容量将等于 Integer.MAX_VALUE
Map
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
补充
一般来说,由于数组以一块连续内存区来保存所有的数组元素,所以数组在随机访问时性能最好,所有的内部以数组作为底层实现的集合在随机访问时性能都比较好;而内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。但总体来说, ArrayList 的性能比 LinkedList 的性能要好,因此大部分时候都应该考虑使用ArrayList 。