Java TreeSet 类

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(279)   2023-06-26 07:54:18

Java TreeSet扩展了 AbstractSet实现了 NavigableSet 接口。它与 HashSet 类非常相似,只是它以排序 的方式存储元素。

排序顺序可以是自然顺序,也可以是树集创建时提供的比较器,具体取决于哪个构造函数被使用。

1. TreeSet 层次结构

TreeSet 类扩展了 AbstractSet 类并实现了 NavigableSet 接口。 NavigableSet 接口以分层顺序扩展 SortedSet

class TreeSet<E> extends AbstractSet<E> 
				implements NavigableSet<E>, Cloneable, Serializable 
{
	//implementation
}

TreeSet Hierarchy

树集层次结构

2. TreeSet 特征

  • 它扩展了 AbstractSet 类,该类扩展了 AbstractCollection 类。
  • 它实现了扩展SortedSet接口的NavigableSet接口。
  • TreeSet 中不允许有重复值。
  • TreeSet 中不允许使用 NULL。
  • 它是一个有序集合,按排序顺序存储元素。
  • 与 HashSet 一样,此类为基本操作(添加、删除、包含和尺寸)。
  • TreeSet 不允许插入异构对象,因为它必须比较对象以确定排序顺序。
  • TreeSet 不是同步。如果多个线程同时访问一个哈希集,并且至少有一个线程修改了该集,则必须在外部进行同步。
  • 使用Collections.synchronizedSortedSet(new TreeSet())方法获取同步的TreeSet。
  • 此类的迭代器方法返回的迭代器是fail-fast,如果在创建迭代器后的任何时间以任何方式修改集合,则可能会抛出ConcurrentModificationException除了通过迭代器自己的 remove() 方法。
  • TreeSet 还实现了 Searlizable 和 Cloneable 接口。

3. TreeSet 构造器

TreeSet 有四种可能的构造函数:

  1. TreeSet():创建一个新的空树集,并根据其元素的自然顺序进行排序。
  2. TreeSet(Comparator c):创建一个新的空树集,根据指定的比较器排序。
  3. TreeSet(SortedSet s):创建一个包含相同元素并使用与指定排序集相同顺序的新树集。
  4. TreeSet(Collection c):创建一个新的树集,其中包含指定集合中的元素,并根据其元素的自然顺序进行排序。

4. TreeSet 方法

  1. boolean add(E e) :如果指定元素不存在,则将其添加到 Set 中。
  2. Comparator comparator() :返回用于对该集合中的元素进行排序的比较器,如果该集合使用其元素的自然排序,则返回 null。
  3. Object first() :返回当前集合中的第一个(最低)元素。
  4. Object last() :返回当前集合中的最后一个(最大)元素。
  5. void clear() :从 TreeSet 中删除所有元素。
  6. boolean contains(Object o) :如果 TreeSet 包含指定的元素,则返回 true,否则返回 false
  7. boolean isEmpty() :如果 TreeSet 不包含任何元素,则返回 true,否则返回 false
  8. int size() :返回 TreeSet 中元素的数量。
  9. Iterator iterator() :按升序返回此集合中元素的迭代器。
  10. Iterator descendingIterator() :按降序返回此集合中元素的迭代器。
  11. NavigableSet descendingSet() :返回此集合中包含的元素的倒序视图。
  12. boolean remove(Object o) :如果指定元素存在,则从 TreeSet 中移除指定元素并返回 true,否则返回 false
  13. Object clone() :返回 TreeSet 的浅表副本。
  14. Spliterator spliterator() :在此 TreeSet 中的元素上创建一个后期绑定和快速失败的 Spliterator。它与 treeset 提供的顺序相同。

5. 树集示例

5.1. TreeSet 添加、删除、迭代器示例

//1. Create TreeSet
TreeSet<String> TreeSet = new TreeSet<>();

//2. Add elements to TreeSet 
TreeSet.add("A");
TreeSet.add("B");
TreeSet.add("C");
TreeSet.add("D");
TreeSet.add("E");

System.out.println(TreeSet);

//3. Check if element exists
boolean found = TreeSet.contains("A");        //true
System.out.println(found);

//4. Remove an element
TreeSet.remove("D");

//5. Iterate over values
Iterator<String> itr = TreeSet.iterator();

while(itr.hasNext()) 
{
    String value = itr.next();
    
    System.out.println("Value: " + value);
}

程序输出。

[A, B, C, D, E]
true
Value: A
Value: B
Value: C
Value: E

5.2.将 TreeSet 转换为数组示例

使用 toArrray() 方法将 TreeSet 转换为 array 的 Java 示例。

TreeSet<String> TreeSet = new TreeSet<>();
        
TreeSet.add("A");
TreeSet.add("B");
TreeSet.add("C");
TreeSet.add("D");
TreeSet.add("E");

String[] values = new String[TreeSet.size()];

TreeSet.toArray(values);

System.out.println(Arrays.toString(values));

程序输出。

[A, B, C, D, E]

5.3.将 TreeSet 转换为 ArrayList 示例

使用 Java 8 流 API 将 TreeSet 转换为 arraylist 的 Java 示例。

TreeSet<String> TreeSet = new TreeSet<>();
        
TreeSet.add("A");
TreeSet.add("B");
TreeSet.add("C");
TreeSet.add("D");
TreeSet.add("E");

List<String> valuesList = TreeSet.stream().collect(Collectors.toList());

System.out.println(valuesList);

程序输出。

[A, B, C, D, E]

6. TreeSet 用例

TreeSet 与 HashSet(唯一元素)非常相似,并提供可预测的迭代顺序(已排序)。可以使用自定义比较器覆盖排序顺序。

TreeSet 在底层使用了红黑树。所以这个集合可以被认为是一个动态搜索树。当你需要一个频繁读写操作的结构,又要保持有序时,TreeSet 是一个不错的选择。

如果你想让一个集合保持排序并且你主要是追加元素,那么带有比较器的 TreeSet 是你最好的选择。

7. TreeSet 性能

  • TreeSet 为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本。
  • 按排序顺序迭代元素等操作需要 O(n) 时间。

八、结论

从上面的讨论中,很明显,在我们想要以排序方式处理重复记录的情况下,TreeSet 是非常有用的集合类。它还为基本操作提供可预测的性能。

如果不需要元素的排序顺序,那么建议改用轻量级的 HashSet 和 HashMap。

在评论中将您与 Java 中的 TreeSet 相关的问题告诉我。

快乐学习!!

参考:

TreeSet Java 文档

地址:https://www.cundage.com/article/java-treeset-class.html

相关阅读

Java LinkedHashSet 类扩展了 HashSet 并实现了 Set 接口。它与 HashSet 类非常相似,除非提供可预测的迭代顺序&lt; /strong&gtl;。 1. Li...
Java Iterator 接口用于迭代 Collection 的元素(List、Set 或 地图)。 Iterator 有助于从指定集合中逐个检索元素,并可选择对每个元素执行操作。 Java ...
Java Stream 收集教程展示了如何使用收集器进行缩减操作。 Java流 Java 流 是来自支持聚合操作的源的元素序列。流不存储元素;元素是按需计算的。从集合、数组或 I/O 资源等数据...
Java TreeSet 类扩展了 AbstractSet 并实现了 NavigableSet 接口。它与 HashSet 类非常相似,只是它以排序 的方式存储元素。 排序顺序可以是自然顺序,也...
Java CopyOnWriteArraySet 是 线程安全 变体 &lt; strong&gtl;HashSet 它使用底层 CopyOnWriteArrayList操作。 与 CopyOn...
下面的示例使用不同的技术来迭代 java 集合。在任何情况下都选择使用适合您且方便的方式。 Iterable.forEach 方法(Java 8) 最近在 java 8 中引入,此方法可以在任何...
Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
在本文中,我们处理集合。 Java 为数据存储和检索提供了专门的类。 Java 5 引入了泛型集合。通用集合更灵活,它们是处理数据的首选方式。泛型集合增强了代码重用、类型安全和性能。 集合框架中...
Java Spliterator 接口是一个内部迭代器,它将流 分成更小的部分。这些较小的零件可以并行处理。 在实际编程中,我们可能永远不需要直接使用Spliterator。在正常操作下,它的行...
学习在 Java 中交换 arraylist 中的两个元素。我们将使用 Collections.swap() 方法在指定索引处交换指定数组列表中的两个元素。 1.交换arraylist中的两个元...