📜  PriorityQueue 和 TreeSet 的区别(1)

📅  最后修改于: 2023-12-03 15:33:47.866000             🧑  作者: Mango

PriorityQueue 和 TreeSet 的区别

目录
概述

Java 语言中有很多集合类,其中两个常用的类是 PriorityQueue 和 TreeSet。它们实现了不同的数据结构,各自有不同的特性和使用场景。

本文将介绍 PriorityQueue 和 TreeSet 的区别、实现、特性和使用。

PriorityQueue
实现

PriorityQueue 是一个基于优先级堆的无界队列,由数组实现,可以在数组任意位置插入元素。

特性
  • 以优先级顺序来定位元素,不支持随意访问。
  • 优先级可以自定义,也可以使用元素的自然顺序。
  • 不允许 null 元素。
使用

使用 PriorityQueue 时,需要注意以下几个方面:

  • 添加元素使用 offer(E e) 方法,删除元素使用 poll() 方法;
  • 获取优先级最高的元素使用 peek() 方法,不会删除元素;
  • 内部存储结构是基于数组实现的,可以根据需要自定义容量大小;
  • 加入元素时会根据优先级排序,取出元素时取出优先级最高的元素。

示例代码:

PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.offer(3);
queue.offer(1);
queue.offer(2);
System.out.println(queue.poll()); // 输出 1
System.out.println(queue.poll()); // 输出 2
System.out.println(queue.poll()); // 输出 3
TreeSet
实现

TreeSet 是一个有序的集合,它用一棵树来实现元素的存储,可以保证元素按照自然顺序进行排序。

特性
  • 保证元素按照一定顺序排序(自然顺序或自定义顺序);
  • 不允许重复元素;
  • 支持高效的插入、删除、搜索操作,时间复杂度为 O(log n)。
使用

使用 TreeSet 时,需要注意以下几个方面:

  • 添加元素使用 add(E e) 方法,删除元素使用 remove(Object o) 方法;
  • 可以使用 iterator() 方法获取迭代器遍历 TreeSet 中的元素;
  • 内部存储结构是基于红黑树实现的,可以根据需要自定义容量大小;
  • 可以根据需要使用 Comparator 来定义元素排序方式。

示例代码:

TreeSet<Integer> set = new TreeSet<>();
set.add(3);
set.add(1);
set.add(2);
for (Integer n : set) {
    System.out.println(n);
}
// 输出 1, 2, 3
比较

两者的最大区别在于:

  • PriorityQueue 是基于优先级堆实现的,按照元素的优先级进行排序;
  • TreeSet 是基于红黑树实现的,按照元素的自然顺序或 Comparator 进行排序。

使用 PriorityQueue 更适合那些需要根据优先级排序的场景,而使用 TreeSet 更适合需要排序并且去重的场景。

总结

本文介绍了 PriorityQueue 和 TreeSet 的区别、实现、特性和使用。根据不同的使用场景,选择正确的集合类可以大大提高程序的效率和可维护性。