前言
Java中常用的集合很多,在使用的时候我相信很多人都无从下手,不知道使用哪个集合更适合。为了能让我自己和更多人清晰的了解它们,并且能在一定情况下使用最适合的集合,有了本篇文章。如有错误或遗漏,还请大神指出,感激不尽!
数组与集合的区别
长度是否可变 | 存储数据类型 | |
---|---|---|
数组 | 否,长度固定 | 只可以存放同类型元素,可以是基本数据类型,也可以是引用类型 |
集合 | 是,长度可变 | 可存放不同类型元素,只可以是引用类型 |
数组是我们熟知的,但使用数组有很多不便利,一旦数组被创建,程序运行期间数组长度是不可改变的。当我们需要对数组的长度做出改变或者要求数组中存放不同类型的引用数据,就可以使用集合。
Java集合总览
集合可以看作是一种容器,用来存储对象信息。所有集合类都在 java.util 包下,但支持多线程的集合类位于 java.util.concurrent 包下。Java的集合类主要由两个根接口派生出来,分别是Collection 和 Map,此篇文章会分别介绍其各个子类的特点及使用方法。
Collection接口
存储元素是否有序 | 存储元素是否可重复 | |
---|---|---|
List(列表) | 有序 | 可重复 |
Queue(队列) | 有序 | 可重复 |
Set(集) | 无序 | 不可重复 |
1、List集合
1)ArrayList
特点:
- List集合中最主要的常用类
- 底层数据结构是数组,
- 查询快,增删慢。
- 线程不安全,效率高。
2)Vector
特点:
- 底层数据结构是数组,
- 查询快,增删慢。
- 线程安全,效率低。
3)Stack
特点:
- 是Vector的实现类,实现一个后进先出的堆栈。
- Stack提供5个额外的方法使 Vector得以被当做堆栈使用。push 和 pop 方法,还有 peek 方法得到堆栈的元素, empty方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空栈。
4)LinkedList
特点:
- 底层数据结构是链表
- 查询慢,增删快。
- 线程不安全,效率高。
2、Queue集合
- 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
- Deque类是Queue的实现类。而LinkedList 类既实现了 List 接口又实现了 Deque 接口(也就实现了 Queue接口)。Queue 接口窄化了对 LinkedList 的方法的访问权限,即在方法中的参数类型如果是 Queue 时,就完全只能访问 Queue 接口定义的方法了,而不能直接访问 LinkedList 的非 Queue 的方法。以使得只有恰当的方法才可以使用。
3、Set集合
1)HashSet类
特点:
- HashSet 类是 Set 集合最常用实现类
- 底层数据结构是哈希表。
- 存取和查找性能好。
- 集合元素值可以是 null
2)LinkedHashSet
特点:
- 是 HashSet 的一个子类,具有 HashSet 的特性。
- 底层数据结构是链表和哈希表,由链表维护元素有序,元素的顺序与添加顺序一致。由哈希表保证元素唯一。
3)TreeSet
特点:
- 底层数据结构是二叉树,是 SortedSet 接口的实现类,可以保证元素处于排序状态。
- TreeSet 支持两种元素排序:自然排序、定制排序。
Map接口
Map接口采用键值对 Map<k,v> 的存储方式,保存具有映射关系的数据。因此,Map 集合里保存两组值,一组值用于保存 Map 里的 key,另外一组值用于保存 Map 里的 value,key 和 value 可以是任意类型的数据,key 值不允许重复,可以为null。如果添加 key-value 对时 Map中已经有重复的 key,则新添加的value 会覆盖原来对应的 value。
1、HashTable与HashSet
HashTable 与 HashSet 是 Map 接口的两个典型实现,他们之间的关系完全类似于 ArrayList 和 Vertor.HashTable 是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用。
特点:
- HashTable线程不安全,HashTable 线程安全。
- HashMap 通常比 HashTable 要快。因为HashTable比较古老。
- HashMap的key与value可以是null值。HashTable不允许使用Null值作为key和value,如果把null放入HashTable中,会发生空指针异常。
2、LinkedHashMap类
LinkedHashMap使用双向链表维护 key-value对的次序(其实只需要考虑key的次序即可),该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能。
3、Properties类
Properties类时Hashtable类的子类,它相当于一个key、value都是String类型的Map,主要用于读取配置文件。
4、TreeMap类
TreeMap是SortedMap的实现类,是一个二叉树的数据结构,每个key-value对作为二叉树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap也有两种排序方式:
-
自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException。
-
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。