集合

82 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

Java 集合

Java集合中有两大类,分别是 Collection 和 Map 类。Collection类的集合主要存放的是单个对象,而Map类的集合主要存储的是key-value键值对类型的对象。 QQ截图20220809170548.png QQ截图20220809170823.png

List

List:List 是一个接口,它继承于Collection的接口。. 它代表着有序的队列。List中元素可以重复,并且是有序的。

  • ArrayList:Object[] 数组,查询快,增删慢,线程不安全,效率高,可重复。
  • LinkedList 双向链表,查询慢,增删快,线程不安全,效率高,可重复。
  • Vector:Object[] 数组,查询快,增删慢,线程安全,效率低,可重复。

Set

Set:Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。

  • HashSet: 基于 HashMap 实现的,底层采用 HashMap 来保存元素,无序且不可重复。
  • TreeSet:有序且不可重复。

Queue

Queue:Queue是java中实现队列的接口,它按特定的规则来确定排队的先后顺序,存储的元素是有序的并且可重复。

  • PriorityQueue: Object[] 数组,有序且可重复。
  • ArrayQueue: Object[] 数组 + 双指针。有序且可重复。

Map

Map:Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。键对象不能重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。Map 接口有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。

  • HashMap:HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。查询速度块,无序且不支持线程同步。
  • TreeMap:TreeMap能够比较元素大小,且有两种排序方式自然排序和自定义两种排序方式对键进行排序。TreeMap实现了红黑树的结构,形成了一颗二叉树。

如何选用集合?

根据数据类型和用途来进行选择,如果需要用键查找数据则可以使用Map中的集合,根据是否需要排序再对TreeMap和HashMap进行选择,如果需要保证线程安全就选用 ConcurrentHashMap。如果我们只需要存放数据,可以选择Collection集合,根据数据是否可以重复再进行后面一系列的选择。总的来说就是根据数据的存放和类型以及是否排序等方面来选择不同的集合。

为什么要使用集合?

因为在我们工作的时候大多数的数据都不是同类型的,而集合可以存储这些数据。而且集合还可以根据数据是否重复,有序等来进一步确定需要的集合。而被确定下来的集合在查找数据的时候可以提高相应数据的查找效率。

无序性和不可重复性的含义是什么

  • 无序性是指存储的数据在存放时并没有按照数组索引的顺序存放,而是根据哈希值来决定存放位置,这和随机性不是一个性质。
  • 不可重复性是指存放的元素不能相同,按 equals()方法进行判断。

ArrayDeque 与 LinkedList 的区别

ArrayDeque实现了 Deque 接口,使用可变数组,其存储容量没有上限,同时ArrayDeque的线程不太安全。 LinkedList也实现了 Deque 接口,但它是双向链表,查询慢,增删快,线程不安全,效率高,可重复。

PriorityQueue

  • PriorityQueue 一个基于优先级的无界优先级队列。元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序。该队列不允许使用 null 元素也不允许插入不可比较的对象。
  • PriorityQueue 队列的头指针指向排序规则最小那个元素。如果多个元素都是最小值则随机选一个。
  • PriorityQueue 是一个无界队列,其容量会自动扩容。