Java TreeSet类

treeset.png

Java TreeSet类实现了使用树进行存储的Set接口。它继承了AbstractSet类并实现了NavigableSet接口。TreeSet类的对象按升序存储。

关于Java TreeSet类的重要点有:

  • Java TreeSet类仅包含唯一元素,就像HashSet一样。
  • Java TreeSet类的访问和检索时间非常快。
  • Java TreeSet类不允许空元素。
  • Java TreeSet类是非同步的。
  • Java TreeSet类维护升序。
  • Java TreeSet类仅包含唯一元素,就像HashSet一样。
  • Java TreeSet类的访问和检索时间非常快。
  • Java TreeSet类不允许空元素。
  • Java TreeSet类是非同步的。
  • Java TreeSet类维护升序。
  • TreeSet只能允许可比较的泛型类型。例如,StringBuffer类实现了Comparable接口。

TreeSet类的内部工作原理

TreeSet使用二叉搜索树实现,它是自平衡的,就像红黑树一样。因此,搜索、删除和添加等操作的时间复杂度为O(log(N))。这是因为二叉搜索树是自平衡的,它确保了树的高度对于所有这些操作都不会超过O(log(N))。因此,它是一种有效的数据结构,用于存储排序的大量数据并对其执行操作。

TreeSet类的同步

如上所述,TreeSet类不是同步的。这意味着如果多个线程同时访问一个TreeSet,并且其中一个访问线程对其进行修改,那么必须手动进行同步。通常情况下,可以通过对封装集合的某个对象进行同步来实现。但是,在找不到这样的对象的情况下,可以使用Collections.synchronizedSet()方法对集合进行包装。建议在创建时使用该方法,以避免对集合进行不同步的访问。以下代码片段显示了相同的情况。

TreeSet treeSet = new TreeSet();

Set syncrSet = Collections.synchronziedSet(treeSet);

TreeSet类的层次结构

如上图所示,Java TreeSet类实现了NavigableSet接口。NavigableSet接口按层次顺序扩展了SortedSet、Set、Collection和Iterable接口。

TreeSet类的声明

让我们看一下java.util.TreeSet类的声明。

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable

Java TreeSet类的构造函数

构造函数描述
TreeSet()构造一个空的树集,根据树集的自然顺序按升序排序。
TreeSet(Collection<? extends E> c)构造一个包含集合c中元素的新树集。
TreeSet(Comparator<? super E> comparator)构造一个空的树集,根据给定的比较器进行排序。
TreeSet(SortedSet<E> s)构造一个包含给定SortedSet中元素的TreeSet。

Java TreeSet类的方法

方法描述
boolean add(E e)如果该集合中尚未包含指定元素,则将其添加到集合中。
boolean addAll(Collection<? extends E> c)将指定集合中的所有元素添加到该集合中。
E ceiling(E e)返回集合中与指定元素相等或大于它的最小元素;如果不存在这样的元素,则返回null。
Comparator<? super E> comparator()返回用于排序的比较器。
Iterator descendingIterator()以降序遍历元素的迭代器。
NavigableSet descendingSet()返回按照相反顺序排列的元素集合。
E floor(E e)返回集合中与指定元素相等或小于它的最大元素;如果不存在这样的元素,则返回null。
SortedSet headSet(E toElement)返回小于指定元素的元素组成的子集。
NavigableSet headSet(E toElement, boolean inclusive)返回小于或等于(如果inclusive为true)指定元素的元素组成的子集。
E higher(E e)返回集合中与指定元素相等或大于它的最小元素;如果不存在这样的元素,则返回null。
Iterator iterator()以升序遍历元素的迭代器。
E lower(E e)返回集合中与指定元素相等或小于它的最大元素;如果不存在这样的元素,则返回null。
E pollFirst()检索并移除最低(第一个)元素。
E pollLast()检索并移除最高(最后一个)元素。
Spliterator spliterator()创建一个后期绑定且快速失败的元素Spliterator。
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)返回处于给定范围内的元素的子集。
SortedSet subSet(E fromElement, E toElement))返回处于给定范围内的元素的子集,包括fromElement但不包括toElement。
SortedSet tailSet(E fromElement)返回大于或等于指定元素的元素组成的子集。
NavigableSet tailSet(E fromElement, boolean inclusive)返回大于或等于(如果inclusive为true)指定元素的元素组成的子集。
boolean contains(Object o)如果该集合包含指定的元素,则返回true。
boolean isEmpty()如果该集合不包含任何元素,则返回true。
boolean remove(Object o)如果集合中存在指定的元素,则从集合中移除它。
void clear()从集合中移除所有元素。
Object clone()返回此TreeSet实例的浅表副本。
E first()返回当前排序集中的第一个(最低)元素。
E last()返回当前排序集中的最后一个(最高)元素。
int size()返回集合中的元素数量。

Java TreeSet示例

Java TreeSet示例1:

让我们看一个简单的Java TreeSet示例。

文件名: TreeSet1.java

import java.util.*;

class TreeSet1 {
   public static void main(String args[]) {
      // Creating and adding elements
      TreeSet<String> al = new TreeSet<String>();
      al.add("Ravi");
      al.add("Vijay");
      al.add("Ravi");
      al.add("Ajay");
      
      // Traversing elements
      Iterator<String> itr = al.iterator();
      while(itr.hasNext()) {
         System.out.println(itr.next());
      }
   }
}

输出:

Ajay
Ravi
Vijay

Java TreeSet示例2:

让我们看一个按降序遍历元素的示例。

文件名: TreeSet2.java

import java.util.*;

class TreeSet2 {
   public static void main(String args[]) {
      TreeSet<String> set = new TreeSet<String>();
      set.add("Ravi");
      set.add("Vijay");
      set.add("Ajay");
      
      System.out.println("Traversing elements through Iterator in descending order");
      Iterator<String> i = set.descendingIterator();
      while(i.hasNext()) {
         System.out.println(i.next());
      }
   }
}

输出:

Traversing elements through Iterator in descending order
Vijay
Ravi
Ajay

Java TreeSet示例3:

让我们看一个检索并移除最高值和最低值的示例。

文件名: TreeSet3.java

import java.util.*;

class TreeSet3 {
   public static void main(String args[]) {
      TreeSet<Integer> set = new TreeSet<Integer>();
      set.add(24);
      set.add(66);
      set.add(12);
      set.add(15);
      
      System.out.println("Lowest Value: " + set.pollFirst());
      System.out.println("Highest Value: " + set.pollLast());
   }
}

输出:

Lowest Value: 12
Highest Value: 66

Java TreeSet示例4:

在这个示例中,我们执行了各种NavigableSet操作。

文件名: TreeSet4.java

import java.util.*;

class TreeSet4 {
   public static void main(String args[]) {
      TreeSet<String> set = new TreeSet<String>();
      set.add("A");
      set.add("B");
      set.add("C");
      set.add("D");
      set.add("E");
      
      System.out.println("Initial Set: " + set);
      
      System.out.println("Reverse Set: " + set.descendingSet());
      
      System.out.println("Head Set: " + set.headSet("C", true));
      
      System.out.println("SubSet: " + set.subSet("A", false, "E", true));
      
      System.out.println("TailSet: " + set.tailSet("C", false));
   }
}

输出:

Initial Set: [A, B, C, D, E]
Reverse Set: [E, D, C, B, A]
Head Set: [A, B, C]
SubSet: [B, C, D, E]
TailSet: [D, E]

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想