TreeSet是一个有序的集合,它的作用是提供有序的Set集合。它继承了AbstractSet抽象类,实现了NavigableSet1a4db2c2c2313771e5742b6debf617a1,Cloneable,Serializable接口。TreeSet是基于TreeMap实现的,TreeSet的元素支持2种排序方式:自然排序或者根据提供的Comparator进行排序。
TreeSet的接口依赖图:
从图中可以看出:
(1)TreeSet继承于AbstractSet,并且实现了NavigableSet接口。
(2)TreeSet是一个包含有序的且没有重复元素的集合,通过TreeMap实现。
TreeSet的主要函数:
add(E object) addAll(Collection83508b3899359a73fc86fed79373d537 collection) clear() Object clone() contains(Object object) E first() isEmpty() E last() E pollFirst() E pollLast() E lower(E e) E floor(E e) E ceiling(E e) E higher(E e) remove(Object object) size() Comparator83508b3899359a73fc86fed79373d537 comparator() Iteratora8093152e673feb7aba1828c43532094 iterator() Iteratora8093152e673feb7aba1828c43532094 descendingIterator() SortedSeta8093152e673feb7aba1828c43532094 headSet(E end) NavigableSeta8093152e673feb7aba1828c43532094 descendingSet() NavigableSeta8093152e673feb7aba1828c43532094 headSet(E endendInclusive) SortedSeta8093152e673feb7aba1828c43532094 subSet(E startE end) NavigableSeta8093152e673feb7aba1828c43532094 subSet(E startstartInclusiveE endendInclusive) NavigableSeta8093152e673feb7aba1828c43532094 tailSet(E startstartInclusive) SortedSeta8093152e673feb7aba1828c43532094 tailSet(E start)
TreeSet遍历方式:
(1)迭代器顺序遍历方式:
(Iterator iter = set.iterator()iter.hasNext()) { iter.next()}
(2)迭代器倒序遍历方式:
(Iterator iter = set.descendingIterator()iter.hasNext()) { iter.next()}
(3)foreach遍历HashSet
<p style="margin-bottom: 9px;"><a href="http://www.php.cn/wiki/57.html" target="_blank">String</a>[] arr = (String[])set.to<a href="http://www.php.cn/wiki/58.html" target="_blank">Array</a>(<span style="background-color:inherit; color:rgb(204,120,50)"><a href="http://www.php.cn/wiki/165.html" target="_blank">new</a> </span>String[<span style="background-color:inherit; color:rgb(104,151,187)">0</span>])<span style="background-color:inherit; color:rgb(204,120,50)">;<br></span><span style="background-color:inherit; color:rgb(204,120,50)">for </span>(String str:arr)<br>{<br> System.out.<a href="http://www.php.cn/wiki/1363.html" target="_blank">printf</a>(<span style="background-color:inherit; color:rgb(106,135,89)">"for each : %s</span><span style="background-color:inherit; color:rgb(204,120,50)">\n</span><span style="background-color:inherit; color:rgb(106,135,89)">"</span><span style="background-color:inherit; color:rgb(204,120,50)">, </span>str)<span style="background-color:inherit; color:rgb(204,120,50)">;<br></span>}<br></p>
TreeSet示例代码:
public class Hello { public static void main(String[] args) { testTreeSetAPIs(); } // 测试TreeSet的api public static void testTreeSetAPIs() { String val; // 新建TreeSet TreeSet tSet = new TreeSet(); // 将元素添加到TreeSet中 tSet.add("aaa"); // Set中不允许重复元素,所以只会保存一个“aaa” tSet.add("aaa"); tSet.add("bbb"); tSet.add("eee"); tSet.add("ddd"); tSet.add("ccc"); System.out.println("TreeSet:"+tSet); // 打印TreeSet的实际大小 System.out.printf("size : %d\n", tSet.size()); // 导航方法 // floor(小于、等于) System.out.printf("floor bbb: %s\n", tSet.floor("bbb")); // lower(小于) System.out.printf("lower bbb: %s\n", tSet.lower("bbb")); // ceiling(大于、等于) System.out.printf("ceiling bbb: %s\n", tSet.ceiling("bbb")); System.out.printf("ceiling eee: %s\n", tSet.ceiling("eee")); // ceiling(大于) System.out.printf("higher bbb: %s\n", tSet.higher("bbb")); // subSet() System.out.printf("subSet(aaa, true, ccc, true): %s\n", tSet.subSet("aaa", true, "ccc", true)); System.out.printf("subSet(aaa, true, ccc, false): %s\n", tSet.subSet("aaa", true, "ccc", false)); System.out.printf("subSet(aaa, false, ccc, true): %s\n", tSet.subSet("aaa", false, "ccc", true)); System.out.printf("subSet(aaa, false, ccc, false): %s\n", tSet.subSet("aaa", false, "ccc", false)); // headSet() System.out.printf("headSet(ccc, true): %s\n", tSet.headSet("ccc", true)); System.out.printf("headSet(ccc, false): %s\n", tSet.headSet("ccc", false)); // tailSet() System.out.printf("tailSet(ccc, true): %s\n", tSet.tailSet("ccc", true)); System.out.printf("tailSet(ccc, false): %s\n", tSet.tailSet("ccc", false)); // 删除“ccc” tSet.remove("ccc"); // 将Set转换为数组 String[] arr = (String[])tSet.toArray(new String[0]); for (String str:arr) System.out.printf("for each : %s\n", str); // 打印TreeSet System.out.printf("TreeSet:%s\n", tSet); // 遍历TreeSet for(Iterator iter = tSet.iterator(); iter.hasNext(); ) { System.out.printf("iter : %s\n", iter.next()); } // 删除并返回第一个元素 val = (String)tSet.pollFirst(); System.out.printf("pollFirst=%s, set=%s\n", val, tSet); // 删除并返回最后一个元素 val = (String)tSet.pollLast(); System.out.printf("pollLast=%s, set=%s\n", val, tSet); // 清空HashSet tSet.clear(); // 输出HashSet是否为空 System.out.printf("%s\n", tSet.isEmpty()?"set is empty":"set is not empty"); } }
基于Java8的TreeSet源码分析:
public class Hello { public static void main(String[] args) { testTreeSetAPIs(); } // 测试TreeSet的api public static void testTreeSetAPIs() { String val; // 新建TreeSet TreeSet tSet = new TreeSet(); // 将元素添加到TreeSet中 tSet.add("aaa"); // Set中不允许重复元素,所以只会保存一个“aaa” tSet.add("aaa"); tSet.add("bbb"); tSet.add("eee"); tSet.add("ddd"); tSet.add("ccc"); System.out.println("TreeSet:"+tSet); // 打印TreeSet的实际大小 System.out.printf("size : %d\n", tSet.size()); // 导航方法 // floor(小于、等于) System.out.printf("floor bbb: %s\n", tSet.floor("bbb")); // lower(小于) System.out.printf("lower bbb: %s\n", tSet.lower("bbb")); // ceiling(大于、等于) System.out.printf("ceiling bbb: %s\n", tSet.ceiling("bbb")); System.out.printf("ceiling eee: %s\n", tSet.ceiling("eee")); // ceiling(大于) System.out.printf("higher bbb: %s\n", tSet.higher("bbb")); // subSet() System.out.printf("subSet(aaa, true, ccc, true): %s\n", tSet.subSet("aaa", true, "ccc", true)); System.out.printf("subSet(aaa, true, ccc, false): %s\n", tSet.subSet("aaa", true, "ccc", false)); System.out.printf("subSet(aaa, false, ccc, true): %s\n", tSet.subSet("aaa", false, "ccc", true)); System.out.printf("subSet(aaa, false, ccc, false): %s\n", tSet.subSet("aaa", false, "ccc", false)); // headSet() System.out.printf("headSet(ccc, true): %s\n", tSet.headSet("ccc", true)); System.out.printf("headSet(ccc, false): %s\n", tSet.headSet("ccc", false)); // tailSet() System.out.printf("tailSet(ccc, true): %s\n", tSet.tailSet("ccc", true)); System.out.printf("tailSet(ccc, false): %s\n", tSet.tailSet("ccc", false)); // 删除“ccc” tSet.remove("ccc"); // 将Set转换为数组 String[] arr = (String[])tSet.toArray(new String[0]); for (String str:arr) System.out.printf("for each : %s\n", str); // 打印TreeSet System.out.printf("TreeSet:%s\n", tSet); // 遍历TreeSet for(Iterator iter = tSet.iterator(); iter.hasNext(); ) { System.out.printf("iter : %s\n", iter.next()); } // 删除并返回第一个元素 val = (String)tSet.pollFirst(); System.out.printf("pollFirst=%s, set=%s\n", val, tSet); // 删除并返回最后一个元素 val = (String)tSet.pollLast(); System.out.printf("pollLast=%s, set=%s\n", val, tSet); // 清空HashSet tSet.clear(); // 输出HashSet是否为空 System.out.printf("%s\n", tSet.isEmpty()?"set is empty":"set is not empty"); } }
基于Java8的TreeSet源码分析:
public class TreeSet1a4db2c2c2313771e5742b6debf617a1 extends AbstractSet1a4db2c2c2313771e5742b6debf617a1 implements NavigableSet1a4db2c2c2313771e5742b6debf617a1, Cloneable, java.io.Serializable { /** * The backing map. */ private transient NavigableMapc81ac021d9fe376b0afca3578d66e836 m; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); /** * Constructs a set backed by the specified navigable map. */ //构造函数 TreeSet(NavigableMapc81ac021d9fe376b0afca3578d66e836 m) { this.m = m; } /** * Constructs a new, empty tree set, sorted according to the * natural ordering of its elements. All elements inserted into * the set must implement the {@link Comparable} interface. * Furthermore, all such elements must be 5a8028ccc7a7e27417bff9f05adf5932mutually * comparable72ac96585ae54b6ae11f849d2649d9e6: {@code e1.compareTo(e2)} must not throw a * {@code ClassCastException} for any elements {@code e1} and * {@code e2} in the set. If the user attempts to add an element * to the set that violates this constraint (for example, the user * attempts to add a string element to a set whose elements are * integers), the {@code add} call will throw a * {@code ClassCastException}. */ //构造空的tree set 根据自然顺序对元素进行排序 public TreeSet() { this(new TreeMapc81ac021d9fe376b0afca3578d66e836()); } /** * Constructs a new, empty tree set, sorted according to the specified * comparator. All elements inserted into the set must be 5a8028ccc7a7e27417bff9f05adf5932mutually * comparable72ac96585ae54b6ae11f849d2649d9e6 by the specified comparator: {@code comparator.compare(e1, * e2)} must not throw a {@code ClassCastException} for any elements * {@code e1} and {@code e2} in the set. If the user attempts to add * an element to the set that violates this constraint, the * {@code add} call will throw a {@code ClassCastException}. * * @param comparator the comparator that will be used to order this set. * If {@code null}, the {@linkplain Comparable natural * ordering} of the elements will be used. */ //构造函数,根据特定的比较器对元素进行排序 public TreeSet(Comparatordc5aa4f4a38f04210c53c469d00050f9 comparator) { this(new TreeMapa8093152e673feb7aba1828c43532094(comparator)); } //构造函数,参数为已有的集合 public TreeSet(Collection216930c0ab3d232ff5eb2d5ba8cef959 c) { this(); addAll(c); } /** * Constructs a new tree set containing the same elements and * using the same ordering as the specified sorted set. * * @param s sorted set whose elements will comprise the new set * @throws NullPointerException if the specified sorted set is null */ //构造函数,参数为已经排序的集合 public TreeSet(SortedSet1a4db2c2c2313771e5742b6debf617a1 s) { this(s.comparator()); addAll(s); } /** * Returns an iterator over the elements in this set in ascending order. * * @return an iterator over the elements in this set in ascending order */ //返回顺序排好的迭代器 public Iterator1a4db2c2c2313771e5742b6debf617a1 iterator() { return m.navigableKeySet().iterator(); } /** * Returns an iterator over the elements in this set in descending order. * * @return an iterator over the elements in this set in descending order * @since 1.6 */ //返回倒序排好的迭代器 public Iterator1a4db2c2c2313771e5742b6debf617a1 descendingIterator() { return m.descendingKeySet().iterator(); } /** * @since 1.6 */ //倒序排好的集合 public NavigableSet1a4db2c2c2313771e5742b6debf617a1 descendingSet() { return new TreeSeta8093152e673feb7aba1828c43532094(m.descendingMap()); } /** * Returns the number of elements in this set (its cardinality). * * @return the number of elements in this set (its cardinality) */ //大小 public int size() { return m.size(); } /** * Returns {@code true} if this set contains no elements. * * @return {@code true} if this set contains no elements */ //判断是否为空 public boolean isEmpty() { return m.isEmpty(); } /** * Returns {@code true} if this set contains the specified element. * More formally, returns {@code true} if and only if this set * contains an element {@code e} such that * 78f983dbc27872ba42409adefe5049d9(o==null ? e==null : o.equals(e))d98ca7951c814b9263d12f482df06c69. * * @param o object to be checked for containment in this set * @return {@code true} if this set contains the specified element * @throws ClassCastException if the specified object cannot be compared * with the elements currently in the set * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements */ //判断是否包含某个值 public boolean contains(Object o) { return m.containsKey(o); } /** * Adds the specified element to this set if it is not already present. * More formally, adds the specified element {@code e} to this set if * the set contains no element {@code e2} such that * 78f983dbc27872ba42409adefe5049d9(e==null ? e2==null : e.equals(e2))d98ca7951c814b9263d12f482df06c69. * If this set already contains the element, the call leaves the set * unchanged and returns {@code false}. * * @param e element to be added to this set * @return {@code true} if this set did not already contain the specified * element * @throws ClassCastException if the specified object cannot be compared * with the elements currently in this set * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements */ //添加元素 public boolean add(E e) { return m.put(e, PRESENT)==null; } /** * Removes the specified element from this set if it is present. * More formally, removes an element {@code e} such that * 78f983dbc27872ba42409adefe5049d9(o==null ? e==null : o.equals(e))d98ca7951c814b9263d12f482df06c69, * if this set contains such an element. Returns {@code true} if * this set contained the element (or equivalently, if this set * changed as a result of the call). (This set will not contain the * element once the call returns.) * * @param o object to be removed from this set, if present * @return {@code true} if this set contained the specified element * @throws ClassCastException if the specified object cannot be compared * with the elements currently in this set * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements */ //删除某个对象 public boolean remove(Object o) { return m.remove(o)==PRESENT; } /** * Removes all of the elements from this set. * The set will be empty after this call returns. */ //清空对象 public void clear() { m.clear(); } /** * Adds all of the elements in the specified collection to this set. * * @param c collection containing elements to be added to this set * @return {@code true} if this set changed as a result of the call * @throws ClassCastException if the elements provided cannot be compared * with the elements currently in the set * @throws NullPointerException if the specified collection is null or * if any element is null and this set uses natural ordering, or * its comparator does not permit null elements */ //添加已经存在的元素到集合中 public boolean addAll(Collection216930c0ab3d232ff5eb2d5ba8cef959 c) { // Use linear-time version if applicable if (m.size()==0 && c.size() > 0 && c instanceof SortedSet && m instanceof TreeMap) { SortedSet216930c0ab3d232ff5eb2d5ba8cef959 set = (SortedSet216930c0ab3d232ff5eb2d5ba8cef959) c; TreeMapc81ac021d9fe376b0afca3578d66e836 map = (TreeMap8e751a6654859f4ad3ab548dad16afed) m; Comparator6b3d0130bba23ae47fe2b8e8cddf0195 cc = set.comparator(); Comparatordc5aa4f4a38f04210c53c469d00050f9 mc = map.comparator(); if (cc==mc || (cc != null && cc.equals(mc))) { map.addAllForTreeSet(set, PRESENT); return true; } } return super.addAll(c); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code fromElement} or {@code toElement} * is null and this set uses natural ordering, or its comparator * does not permit null elements * @throws IllegalArgumentException {@inheritDoc} * @since 1.6 */ //截取集合从fromElement到toElement public NavigableSet1a4db2c2c2313771e5742b6debf617a1 subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { return new TreeSeta8093152e673feb7aba1828c43532094(m.subMap(fromElement, fromInclusive, toElement, toInclusive)); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code toElement} is null and * this set uses natural ordering, or its comparator does * not permit null elements * @throws IllegalArgumentException {@inheritDoc} * @since 1.6 */ //获得从集合开始到toElement的元素 public NavigableSet1a4db2c2c2313771e5742b6debf617a1 headSet(E toElement, boolean inclusive) { return new TreeSeta8093152e673feb7aba1828c43532094(m.headMap(toElement, inclusive)); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code fromElement} is null and * this set uses natural ordering, or its comparator does * not permit null elements * @throws IllegalArgumentException {@inheritDoc} * @since 1.6 */ //获得从fromElement开始到结尾的元素 public NavigableSet1a4db2c2c2313771e5742b6debf617a1 tailSet(E fromElement, boolean inclusive) { return new TreeSeta8093152e673feb7aba1828c43532094(m.tailMap(fromElement, inclusive)); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code fromElement} or * {@code toElement} is null and this set uses natural ordering, * or its comparator does not permit null elements * @throws IllegalArgumentException {@inheritDoc} */ //截取元素,从fromElement到toElement public SortedSet1a4db2c2c2313771e5742b6debf617a1 subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code toElement} is null * and this set uses natural ordering, or its comparator does * not permit null elements * @throws IllegalArgumentException {@inheritDoc} */ //从头开始到toElement,不包含toElement public SortedSet1a4db2c2c2313771e5742b6debf617a1 headSet(E toElement) { return headSet(toElement, false); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if {@code fromElement} is null * and this set uses natural ordering, or its comparator does * not permit null elements * @throws IllegalArgumentException {@inheritDoc} */ //从fromElement开始(包含)到结尾 public SortedSet1a4db2c2c2313771e5742b6debf617a1 tailSet(E fromElement) { return tailSet(fromElement, true); } //比较器 public Comparatordc5aa4f4a38f04210c53c469d00050f9 comparator() { return m.comparator(); } /** * @throws NoSuchElementException {@inheritDoc} */ //得到第一个元素 public E first() { return m.firstKey(); } /** * @throws NoSuchElementException {@inheritDoc} */ //获得最后一个元素 public E last() { return m.lastKey(); } // NavigableSet API methods /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements * @since 1.6 */ //比e小的一个元素 public E lower(E e) { return m.lowerKey(e); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements * @since 1.6 */ //比e小于等于 public E floor(E e) { return m.floorKey(e); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements * @since 1.6 */ //比e大于等于 public E ceiling(E e) { return m.ceilingKey(e); } /** * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified element is null * and this set uses natural ordering, or its comparator * does not permit null elements * @since 1.6 */ //比e大的 public E higher(E e) { return m.higherKey(e); } /** * @since 1.6 */ //获得第一个元素删除并返回 public E pollFirst() { Map.Entryab4b07cf3a065a76b42638b44364603a e = m.pollFirstEntry(); return (e == null) ? null : e.getKey(); } /** * @since 1.6 */ //获得最后一个元素删除并返回 public E pollLast() { Map.Entryab4b07cf3a065a76b42638b44364603a e = m.pollLastEntry(); return (e == null) ? null : e.getKey(); } /** * Returns a shallow copy of this {@code TreeSet} instance. (The elements * themselves are not cloned.) * * @return a shallow copy of this set */ //浅拷贝 @SuppressWarnings("unchecked") public Object clone() { TreeSet1a4db2c2c2313771e5742b6debf617a1 clone; try { clone = (TreeSet1a4db2c2c2313771e5742b6debf617a1) super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e); } clone.m = new TreeMapa8093152e673feb7aba1828c43532094(m); return clone; } /** * Save the state of the {@code TreeSet} instance to a stream (that is, * serialize it). * * @serialData Emits the comparator used to order this set, or * {@code null} if it obeys its elements' natural ordering * (Object), followed by the size of the set (the number of * elements it contains) (int), followed by all of its * elements (each an Object) in order (as determined by the * set's Comparator, or by the elements' natural ordering if * the set has no Comparator). */ //序列化写对象 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out any hidden stuff s.defaultWriteObject(); // Write out Comparator s.writeObject(m.comparator()); // Write out size s.writeInt(m.size()); // Write out all elements in the proper order. for (E e : m.keySet()) s.writeObject(e); } /** * Reconstitute the {@code TreeSet} instance from a stream (that is, * deserialize it). */ //序列化读对象 private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in any hidden stuff s.defaultReadObject(); // Read in Comparator @SuppressWarnings("unchecked") Comparatordc5aa4f4a38f04210c53c469d00050f9 c = (Comparatordc5aa4f4a38f04210c53c469d00050f9) s.readObject(); // Create backing TreeMap TreeMapc81ac021d9fe376b0afca3578d66e836 tm = new TreeMapa8093152e673feb7aba1828c43532094(c); m = tm; // Read in size int size = s.readInt(); tm.readTreeSet(size, s, PRESENT); } /** * Creates a 907fae80ddef53131f3292ee4f81644b47bdf838fe1f241804499a8943350a02late-binding5db79b134e9f6b82c0b36e0489ee08edd1c6776b927dc33c5d9114750b586338 * and 907fae80ddef53131f3292ee4f81644bfail-fastd1c6776b927dc33c5d9114750b586338 {@link Spliterator} over the elements in this * set. * * e388a4556c0f65e1904146cc1a846beeThe {@code Spliterator} reports {@link Spliterator#SIZED}, * {@link Spliterator#DISTINCT}, {@link Spliterator#SORTED}, and * {@link Spliterator#ORDERED}. Overriding implementations should document * the reporting of additional characteristic values. * * e388a4556c0f65e1904146cc1a846beeThe spliterator's comparator (see * {@link java.util.Spliterator#getComparator()}) is {@code null} if * the tree set's comparator (see {@link #comparator()}) is {@code null}. * Otherwise, the spliterator's comparator is the same as or imposes the * same total ordering as the tree set's comparator. * * @return a {@code Spliterator} over the elements in this set * @since 1.8 */ public Spliterator1a4db2c2c2313771e5742b6debf617a1 spliterator() { return TreeMap.keySpliteratorFor(m); } private static final long serialVersionUID = -2479143000061671589L; }
以上是Java集合之TreeSet的示例代码的详细内容。更多信息请关注PHP中文网其他相关文章!