• Tags         
  • 2018-07-14  23:27:12        
  • 56 °C    

    TreeSet是Java中SortedSet接口最重要的实现之一,它使用Tree进行存储。无论是否提供显式比较器,元素的排序都使用它们的自然顺序由集合维护。如果要正确实现Set接口,则必须与equals一致。它也可以由设置创建时提供的比较器排序,具体取决于使用的构造函数。TreeSet通过继承AbstractSet类来实现NavigableSet接口。
    TreeSet的几个重要特性如下:

    1. TreeSet实现SortedSet接口,因此不允许重复值。
    2. TreeSet中的对象按排序和升序存储。
    3. TreeSet不保留元素的插入顺序,但元素按键排序。
    4. TreeSet不允许插入异类对象。如果尝试添加hetrogeneous对象,它将在运行时抛出classCastException。
    5. TreeSet是存储大量已排序信息的绝佳选择,因为它可以更快地访问和检索,因此可以快速访问这些信息。
    6. TreeSet基本上是像Red-Black Tree这样的自平衡二叉搜索树的实现。因此,添加,删除和搜索等操作需要O(Log n)时间。并且按排序顺序打印n个元素的操作需要O(n)时间。

    TreeSet类的构造函数:

      1. TreeSet t = new TreeSet(); 
        这将创建空的TreeSet对象,其中元素将以默认的自然排序顺序存储。
      2. TreeSet t = new TreeSet(Comparator comp); 
        当需要对元素的排序顺序进行外部规范时,使用此构造函数。
      3. TreeSet t = new TreeSet(Collection col); 
        当从任何Collection对象到TreeSet对象需要任何转换时,将使用此构造函数。
      4. TreeSet t = new TreeSet(SortedSet s) ; 此构造函数用于将SortedSet对象转换为TreeSet对象。

    同步TreeSet:

    TreeSet中的实现在某种意义上不同步,即如果多个线程同时访问树集,并且至少有一个线程修改了该集,则必须在外部进行同步。这通常通过在自然封装集合的某个对象上进行同步来实现。如果不存在此类对象,则应使用Collections.synchronizedSortedSet方法“包装”该集合。这最好在创建时完成,以防止对集合的意外不同步访问:

    TreeSet ts = new TreeSet();
    Set syncSet = Collections.synchronziedSet(ts);

    下面的程序说明了TreeSet的基本操作:

    // Java program to demonstrate insertions in TreeSet
    import java.util.*;
    
    class TreeSetDemo
    {
        public static void main (String[] args)
        {
            TreeSet<String> ts1= new TreeSet<String>();
    
            // Elements are added using add() method
            ts1.add("A");
            ts1.add("B");
            ts1.add("C");
    
            // Duplicates will not get insert
            ts1.add("C");
    
            // Elements get stored in default natural
            // Sorting Order(Ascending)
            System.out.println(ts1);
        }
    }
    

    输出:

    [A,B,C]
    

    在创建和添加元素到TreeSet时,必须记住两件事:

    • 首先,将null插入TreeSet会抛出NullPointerException因为在插入null时,它会与现有元素进行比较,并且null不能与任何值进行比较。
    • 其次,如果插入的对象无法与集合中存在的元素进行比较,则抛出ClassCastException

    注意:对于空树集,当尝试插入null作为第一个值时,将从JDK 7获得NPE。从1.7开始,TreeSet完全不接受null。但是在JDK 6之前,null将被接受为第一个值,但是如果在TreeSet中插入任何更多值,则也会抛出NullPointerException。
    因此它被认为是错误,因此在JDK 7中删除。

    TreeSet类的方法:

    TreeSet实现SortedSet,因此它具有Collection,Set和SortedSet接口中所有方法的可用性。以下是Treeset接口中的方法。

    1. void add(Object o)此方法将根据TreeSet中的某些排序顺序添加指定的元素。不会添加重复的entires。
    2. boolean addAll(Collection c)此方法将指定Collection的所有元素添加到集合中。Collection中的元素应该是同类的,否则将抛出ClassCastException。Collection的重复条目不会添加到TreeSet中。
    3. void clear()此方法将删除所有元素。
    4. boolean contains(Object o)如果TreeSet中存在给定元素,则此方法将返回true,否则返回false。
    5. Object first()如果TreeSet不为null,则此方法将返回TreeSet中的第一个元素,否则将抛出NoSuchElementException。
    6. Object last()如果TreeSet不为null,则此方法将返回TreeSet中的最后一个元素,否则将抛出NoSuchElementException。
    7. SortedSet headSet(Object toElement)此方法将返回TreeSet的元素,这些元素小于指定的元素。
    8. SortedSet tailSet(Object fromElement)此方法将返回TreeSet的元素,这些元素大于或等于指定的元素。
    9. SortedSet subSet(Object fromElement,Object toElement):此方法将返回从fromElement到toElement的元素。fromElement是包含的,toElement是独占的。
    10. boolean isEmpty()如果此set不包含任何元素,则此方法用于返回true;对于相反的情况,此方法用于返回false。
    11. Object clone()该方法用于返回集合的浅表副本,这只是一个简单的复制集合。
    12. int size()此方法用于返回集合的大小或集合中存在的元素数量。
    13. boolean remove(Object o)此方法用于从集合中返回特定元素。
    14. Iterator iterator()返回一个迭代器,用于迭代集合的元素。
    15. Comparator comparator():此方法将返回用于对TreeSet中的元素进行排序的Comparator,如果使用默认的自然排序顺序,它将返回null。

    Java中的TreeSet

     
    转载请保留页面地址:https://www.breakyizhan.com/java/4902.html