TreeMap.java revision 4c89023ef86f29fa9add7db2574f2169fe842577
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.  Oracle designates this
9 * particular file as subject to the "Classpath" exception as provided
10 * by Oracle in the LICENSE file that accompanied this code.
11 *
12 * This code is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 * version 2 for more details (a copy is included in the LICENSE file that
16 * accompanied this code).
17 *
18 * You should have received a copy of the GNU General Public License version
19 * 2 along with this work; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23 * or visit www.oracle.com if you need additional information or have any
24 * questions.
25 */
26
27package java.util;
28
29import java.io.Serializable;
30import java.util.function.BiConsumer;
31import java.util.function.BiFunction;
32import java.util.function.Consumer;
33
34/**
35 * A Red-Black tree based {@link NavigableMap} implementation.
36 * The map is sorted according to the {@linkplain Comparable natural
37 * ordering} of its keys, or by a {@link Comparator} provided at map
38 * creation time, depending on which constructor is used.
39 *
40 * <p>This implementation provides guaranteed log(n) time cost for the
41 * {@code containsKey}, {@code get}, {@code put} and {@code remove}
42 * operations.  Algorithms are adaptations of those in Cormen, Leiserson, and
43 * Rivest's <em>Introduction to Algorithms</em>.
44 *
45 * <p>Note that the ordering maintained by a tree map, like any sorted map, and
46 * whether or not an explicit comparator is provided, must be <em>consistent
47 * with {@code equals}</em> if this sorted map is to correctly implement the
48 * {@code Map} interface.  (See {@code Comparable} or {@code Comparator} for a
49 * precise definition of <em>consistent with equals</em>.)  This is so because
50 * the {@code Map} interface is defined in terms of the {@code equals}
51 * operation, but a sorted map performs all key comparisons using its {@code
52 * compareTo} (or {@code compare}) method, so two keys that are deemed equal by
53 * this method are, from the standpoint of the sorted map, equal.  The behavior
54 * of a sorted map <em>is</em> well-defined even if its ordering is
55 * inconsistent with {@code equals}; it just fails to obey the general contract
56 * of the {@code Map} interface.
57 *
58 * <p><strong>Note that this implementation is not synchronized.</strong>
59 * If multiple threads access a map concurrently, and at least one of the
60 * threads modifies the map structurally, it <em>must</em> be synchronized
61 * externally.  (A structural modification is any operation that adds or
62 * deletes one or more mappings; merely changing the value associated
63 * with an existing key is not a structural modification.)  This is
64 * typically accomplished by synchronizing on some object that naturally
65 * encapsulates the map.
66 * If no such object exists, the map should be "wrapped" using the
67 * {@link Collections#synchronizedSortedMap Collections.synchronizedSortedMap}
68 * method.  This is best done at creation time, to prevent accidental
69 * unsynchronized access to the map: <pre>
70 *   SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));</pre>
71 *
72 * <p>The iterators returned by the {@code iterator} method of the collections
73 * returned by all of this class's "collection view methods" are
74 * <em>fail-fast</em>: if the map is structurally modified at any time after
75 * the iterator is created, in any way except through the iterator's own
76 * {@code remove} method, the iterator will throw a {@link
77 * ConcurrentModificationException}.  Thus, in the face of concurrent
78 * modification, the iterator fails quickly and cleanly, rather than risking
79 * arbitrary, non-deterministic behavior at an undetermined time in the future.
80 *
81 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
82 * as it is, generally speaking, impossible to make any hard guarantees in the
83 * presence of unsynchronized concurrent modification.  Fail-fast iterators
84 * throw {@code ConcurrentModificationException} on a best-effort basis.
85 * Therefore, it would be wrong to write a program that depended on this
86 * exception for its correctness:   <em>the fail-fast behavior of iterators
87 * should be used only to detect bugs.</em>
88 *
89 * <p>All {@code Map.Entry} pairs returned by methods in this class
90 * and its views represent snapshots of mappings at the time they were
91 * produced. They do <strong>not</strong> support the {@code Entry.setValue}
92 * method. (Note however that it is possible to change mappings in the
93 * associated map using {@code put}.)
94 *
95 * <p>This class is a member of the
96 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
97 * Java Collections Framework</a>.
98 *
99 * @param <K> the type of keys maintained by this map
100 * @param <V> the type of mapped values
101 *
102 * @author  Josh Bloch and Doug Lea
103 * @see Map
104 * @see HashMap
105 * @see Hashtable
106 * @see Comparable
107 * @see Comparator
108 * @see Collection
109 * @since 1.2
110 */
111
112public class TreeMap<K,V>
113    extends AbstractMap<K,V>
114    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
115{
116    /**
117     * The comparator used to maintain order in this tree map, or
118     * null if it uses the natural ordering of its keys.
119     *
120     * @serial
121     */
122    private final Comparator<? super K> comparator;
123
124    private transient TreeMapEntry<K,V> root = null;
125
126    /**
127     * The number of entries in the tree
128     */
129    private transient int size = 0;
130
131    /**
132     * The number of structural modifications to the tree.
133     */
134    private transient int modCount = 0;
135
136    /**
137     * Constructs a new, empty tree map, using the natural ordering of its
138     * keys.  All keys inserted into the map must implement the {@link
139     * Comparable} interface.  Furthermore, all such keys must be
140     * <em>mutually comparable</em>: {@code k1.compareTo(k2)} must not throw
141     * a {@code ClassCastException} for any keys {@code k1} and
142     * {@code k2} in the map.  If the user attempts to put a key into the
143     * map that violates this constraint (for example, the user attempts to
144     * put a string key into a map whose keys are integers), the
145     * {@code put(Object key, Object value)} call will throw a
146     * {@code ClassCastException}.
147     */
148    public TreeMap() {
149        comparator = null;
150    }
151
152    /**
153     * Constructs a new, empty tree map, ordered according to the given
154     * comparator.  All keys inserted into the map must be <em>mutually
155     * comparable</em> by the given comparator: {@code comparator.compare(k1,
156     * k2)} must not throw a {@code ClassCastException} for any keys
157     * {@code k1} and {@code k2} in the map.  If the user attempts to put
158     * a key into the map that violates this constraint, the {@code put(Object
159     * key, Object value)} call will throw a
160     * {@code ClassCastException}.
161     *
162     * @param comparator the comparator that will be used to order this map.
163     *        If {@code null}, the {@linkplain Comparable natural
164     *        ordering} of the keys will be used.
165     */
166    public TreeMap(Comparator<? super K> comparator) {
167        this.comparator = comparator;
168    }
169
170    /**
171     * Constructs a new tree map containing the same mappings as the given
172     * map, ordered according to the <em>natural ordering</em> of its keys.
173     * All keys inserted into the new map must implement the {@link
174     * Comparable} interface.  Furthermore, all such keys must be
175     * <em>mutually comparable</em>: {@code k1.compareTo(k2)} must not throw
176     * a {@code ClassCastException} for any keys {@code k1} and
177     * {@code k2} in the map.  This method runs in n*log(n) time.
178     *
179     * @param  m the map whose mappings are to be placed in this map
180     * @throws ClassCastException if the keys in m are not {@link Comparable},
181     *         or are not mutually comparable
182     * @throws NullPointerException if the specified map is null
183     */
184    public TreeMap(Map<? extends K, ? extends V> m) {
185        comparator = null;
186        putAll(m);
187    }
188
189    /**
190     * Constructs a new tree map containing the same mappings and
191     * using the same ordering as the specified sorted map.  This
192     * method runs in linear time.
193     *
194     * @param  m the sorted map whose mappings are to be placed in this map,
195     *         and whose comparator is to be used to sort this map
196     * @throws NullPointerException if the specified map is null
197     */
198    public TreeMap(SortedMap<K, ? extends V> m) {
199        comparator = m.comparator();
200        try {
201            buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
202        } catch (java.io.IOException cannotHappen) {
203        } catch (ClassNotFoundException cannotHappen) {
204        }
205    }
206
207
208    // Query Operations
209
210    /**
211     * Returns the number of key-value mappings in this map.
212     *
213     * @return the number of key-value mappings in this map
214     */
215    public int size() {
216        return size;
217    }
218
219    /**
220     * Returns {@code true} if this map contains a mapping for the specified
221     * key.
222     *
223     * @param key key whose presence in this map is to be tested
224     * @return {@code true} if this map contains a mapping for the
225     *         specified key
226     * @throws ClassCastException if the specified key cannot be compared
227     *         with the keys currently in the map
228     * @throws NullPointerException if the specified key is null
229     *         and this map uses natural ordering, or its comparator
230     *         does not permit null keys
231     */
232    public boolean containsKey(Object key) {
233        return getEntry(key) != null;
234    }
235
236    /**
237     * Returns {@code true} if this map maps one or more keys to the
238     * specified value.  More formally, returns {@code true} if and only if
239     * this map contains at least one mapping to a value {@code v} such
240     * that {@code (value==null ? v==null : value.equals(v))}.  This
241     * operation will probably require time linear in the map size for
242     * most implementations.
243     *
244     * @param value value whose presence in this map is to be tested
245     * @return {@code true} if a mapping to {@code value} exists;
246     *         {@code false} otherwise
247     * @since 1.2
248     */
249    public boolean containsValue(Object value) {
250        for (TreeMapEntry<K,V> e = getFirstEntry(); e != null; e = successor(e))
251            if (valEquals(value, e.value))
252                return true;
253        return false;
254    }
255
256    /**
257     * Returns the value to which the specified key is mapped,
258     * or {@code null} if this map contains no mapping for the key.
259     *
260     * <p>More formally, if this map contains a mapping from a key
261     * {@code k} to a value {@code v} such that {@code key} compares
262     * equal to {@code k} according to the map's ordering, then this
263     * method returns {@code v}; otherwise it returns {@code null}.
264     * (There can be at most one such mapping.)
265     *
266     * <p>A return value of {@code null} does not <em>necessarily</em>
267     * indicate that the map contains no mapping for the key; it's also
268     * possible that the map explicitly maps the key to {@code null}.
269     * The {@link #containsKey containsKey} operation may be used to
270     * distinguish these two cases.
271     *
272     * @throws ClassCastException if the specified key cannot be compared
273     *         with the keys currently in the map
274     * @throws NullPointerException if the specified key is null
275     *         and this map uses natural ordering, or its comparator
276     *         does not permit null keys
277     */
278    public V get(Object key) {
279        TreeMapEntry<K,V> p = getEntry(key);
280        return (p==null ? null : p.value);
281    }
282
283    public Comparator<? super K> comparator() {
284        return comparator;
285    }
286
287    /**
288     * @throws NoSuchElementException {@inheritDoc}
289     */
290    public K firstKey() {
291        return key(getFirstEntry());
292    }
293
294    /**
295     * @throws NoSuchElementException {@inheritDoc}
296     */
297    public K lastKey() {
298        return key(getLastEntry());
299    }
300
301    /**
302     * Copies all of the mappings from the specified map to this map.
303     * These mappings replace any mappings that this map had for any
304     * of the keys currently in the specified map.
305     *
306     * @param  map mappings to be stored in this map
307     * @throws ClassCastException if the class of a key or value in
308     *         the specified map prevents it from being stored in this map
309     * @throws NullPointerException if the specified map is null or
310     *         the specified map contains a null key and this map does not
311     *         permit null keys
312     */
313    public void putAll(Map<? extends K, ? extends V> map) {
314        int mapSize = map.size();
315        if (size==0 && mapSize!=0 && map instanceof SortedMap) {
316            Comparator<?> c = ((SortedMap<?,?>)map).comparator();
317            if (c == comparator || (c != null && c.equals(comparator))) {
318                ++modCount;
319                try {
320                    buildFromSorted(mapSize, map.entrySet().iterator(),
321                                    null, null);
322                } catch (java.io.IOException cannotHappen) {
323                } catch (ClassNotFoundException cannotHappen) {
324                }
325                return;
326            }
327        }
328        super.putAll(map);
329    }
330
331    /**
332     * Returns this map's entry for the given key, or {@code null} if the map
333     * does not contain an entry for the key.
334     *
335     * @return this map's entry for the given key, or {@code null} if the map
336     *         does not contain an entry for the key
337     * @throws ClassCastException if the specified key cannot be compared
338     *         with the keys currently in the map
339     * @throws NullPointerException if the specified key is null
340     *         and this map uses natural ordering, or its comparator
341     *         does not permit null keys
342     */
343    final TreeMapEntry<K,V> getEntry(Object key) {
344        // Offload comparator-based version for sake of performance
345        if (comparator != null)
346            return getEntryUsingComparator(key);
347        if (key == null)
348            throw new NullPointerException();
349        @SuppressWarnings("unchecked")
350            Comparable<? super K> k = (Comparable<? super K>) key;
351        TreeMapEntry<K,V> p = root;
352        while (p != null) {
353            int cmp = k.compareTo(p.key);
354            if (cmp < 0)
355                p = p.left;
356            else if (cmp > 0)
357                p = p.right;
358            else
359                return p;
360        }
361        return null;
362    }
363
364    /**
365     * Version of getEntry using comparator. Split off from getEntry
366     * for performance. (This is not worth doing for most methods,
367     * that are less dependent on comparator performance, but is
368     * worthwhile here.)
369     */
370    final TreeMapEntry<K,V> getEntryUsingComparator(Object key) {
371        @SuppressWarnings("unchecked")
372            K k = (K) key;
373        Comparator<? super K> cpr = comparator;
374        if (cpr != null) {
375            TreeMapEntry<K,V> p = root;
376            while (p != null) {
377                int cmp = cpr.compare(k, p.key);
378                if (cmp < 0)
379                    p = p.left;
380                else if (cmp > 0)
381                    p = p.right;
382                else
383                    return p;
384            }
385        }
386        return null;
387    }
388
389    /**
390     * Gets the entry corresponding to the specified key; if no such entry
391     * exists, returns the entry for the least key greater than the specified
392     * key; if no such entry exists (i.e., the greatest key in the Tree is less
393     * than the specified key), returns {@code null}.
394     */
395    final TreeMapEntry<K,V> getCeilingEntry(K key) {
396        TreeMapEntry<K,V> p = root;
397        while (p != null) {
398            int cmp = compare(key, p.key);
399            if (cmp < 0) {
400                if (p.left != null)
401                    p = p.left;
402                else
403                    return p;
404            } else if (cmp > 0) {
405                if (p.right != null) {
406                    p = p.right;
407                } else {
408                    TreeMapEntry<K,V> parent = p.parent;
409                    TreeMapEntry<K,V> ch = p;
410                    while (parent != null && ch == parent.right) {
411                        ch = parent;
412                        parent = parent.parent;
413                    }
414                    return parent;
415                }
416            } else
417                return p;
418        }
419        return null;
420    }
421
422    /**
423     * Gets the entry corresponding to the specified key; if no such entry
424     * exists, returns the entry for the greatest key less than the specified
425     * key; if no such entry exists, returns {@code null}.
426     */
427    final TreeMapEntry<K,V> getFloorEntry(K key) {
428        TreeMapEntry<K,V> p = root;
429        while (p != null) {
430            int cmp = compare(key, p.key);
431            if (cmp > 0) {
432                if (p.right != null)
433                    p = p.right;
434                else
435                    return p;
436            } else if (cmp < 0) {
437                if (p.left != null) {
438                    p = p.left;
439                } else {
440                    TreeMapEntry<K,V> parent = p.parent;
441                    TreeMapEntry<K,V> ch = p;
442                    while (parent != null && ch == parent.left) {
443                        ch = parent;
444                        parent = parent.parent;
445                    }
446                    return parent;
447                }
448            } else
449                return p;
450
451        }
452        return null;
453    }
454
455    /**
456     * Gets the entry for the least key greater than the specified
457     * key; if no such entry exists, returns the entry for the least
458     * key greater than the specified key; if no such entry exists
459     * returns {@code null}.
460     */
461    final TreeMapEntry<K,V> getHigherEntry(K key) {
462        TreeMapEntry<K,V> p = root;
463        while (p != null) {
464            int cmp = compare(key, p.key);
465            if (cmp < 0) {
466                if (p.left != null)
467                    p = p.left;
468                else
469                    return p;
470            } else {
471                if (p.right != null) {
472                    p = p.right;
473                } else {
474                    TreeMapEntry<K,V> parent = p.parent;
475                    TreeMapEntry<K,V> ch = p;
476                    while (parent != null && ch == parent.right) {
477                        ch = parent;
478                        parent = parent.parent;
479                    }
480                    return parent;
481                }
482            }
483        }
484        return null;
485    }
486
487    /**
488     * Returns the entry for the greatest key less than the specified key; if
489     * no such entry exists (i.e., the least key in the Tree is greater than
490     * the specified key), returns {@code null}.
491     */
492    final TreeMapEntry<K,V> getLowerEntry(K key) {
493        TreeMapEntry<K,V> p = root;
494        while (p != null) {
495            int cmp = compare(key, p.key);
496            if (cmp > 0) {
497                if (p.right != null)
498                    p = p.right;
499                else
500                    return p;
501            } else {
502                if (p.left != null) {
503                    p = p.left;
504                } else {
505                    TreeMapEntry<K,V> parent = p.parent;
506                    TreeMapEntry<K,V> ch = p;
507                    while (parent != null && ch == parent.left) {
508                        ch = parent;
509                        parent = parent.parent;
510                    }
511                    return parent;
512                }
513            }
514        }
515        return null;
516    }
517
518    /**
519     * Associates the specified value with the specified key in this map.
520     * If the map previously contained a mapping for the key, the old
521     * value is replaced.
522     *
523     * @param key key with which the specified value is to be associated
524     * @param value value to be associated with the specified key
525     *
526     * @return the previous value associated with {@code key}, or
527     *         {@code null} if there was no mapping for {@code key}.
528     *         (A {@code null} return can also indicate that the map
529     *         previously associated {@code null} with {@code key}.)
530     * @throws ClassCastException if the specified key cannot be compared
531     *         with the keys currently in the map
532     * @throws NullPointerException if the specified key is null
533     *         and this map uses natural ordering, or its comparator
534     *         does not permit null keys
535     */
536    public V put(K key, V value) {
537        TreeMapEntry<K,V> t = root;
538        if (t == null) {
539            // We could just call compare(key, key) for its side effect of checking the type and
540            // nullness of the input key. However, several applications seem to have written comparators
541            // that only expect to be called on elements that aren't equal to each other (after
542            // making assumptions about the domain of the map). Clearly, such comparators are bogus
543            // because get() would never work, but TreeSets are frequently used for sorting a set
544            // of distinct elements.
545            //
546            // As a temporary work around, we perform the null & instanceof checks by hand so that
547            // we can guarantee that elements are never compared against themselves.
548            //
549            // compare(key, key);
550            //
551            // **** THIS CHANGE WILL BE REVERTED IN A FUTURE ANDROID RELEASE ****
552            if (comparator != null) {
553                if (key == null) {
554                    comparator.compare(key, key);
555                }
556            } else {
557                if (key == null) {
558                    throw new NullPointerException("key == null");
559                } else if (!(key instanceof Comparable)) {
560                    throw new ClassCastException(
561                            "Cannot cast" + key.getClass().getName() + " to Comparable.");
562                }
563            }
564
565            root = new TreeMapEntry<>(key, value, null);
566            size = 1;
567            modCount++;
568            return null;
569        }
570        int cmp;
571        TreeMapEntry<K,V> parent;
572        // split comparator and comparable paths
573        Comparator<? super K> cpr = comparator;
574        if (cpr != null) {
575            do {
576                parent = t;
577                cmp = cpr.compare(key, t.key);
578                if (cmp < 0)
579                    t = t.left;
580                else if (cmp > 0)
581                    t = t.right;
582                else
583                    return t.setValue(value);
584            } while (t != null);
585        }
586        else {
587            if (key == null)
588                throw new NullPointerException();
589            @SuppressWarnings("unchecked")
590                Comparable<? super K> k = (Comparable<? super K>) key;
591            do {
592                parent = t;
593                cmp = k.compareTo(t.key);
594                if (cmp < 0)
595                    t = t.left;
596                else if (cmp > 0)
597                    t = t.right;
598                else
599                    return t.setValue(value);
600            } while (t != null);
601        }
602        TreeMapEntry<K,V> e = new TreeMapEntry<>(key, value, parent);
603        if (cmp < 0)
604            parent.left = e;
605        else
606            parent.right = e;
607        fixAfterInsertion(e);
608        size++;
609        modCount++;
610        return null;
611    }
612
613    /**
614     * Removes the mapping for this key from this TreeMap if present.
615     *
616     * @param  key key for which mapping should be removed
617     * @return the previous value associated with {@code key}, or
618     *         {@code null} if there was no mapping for {@code key}.
619     *         (A {@code null} return can also indicate that the map
620     *         previously associated {@code null} with {@code key}.)
621     * @throws ClassCastException if the specified key cannot be compared
622     *         with the keys currently in the map
623     * @throws NullPointerException if the specified key is null
624     *         and this map uses natural ordering, or its comparator
625     *         does not permit null keys
626     */
627    public V remove(Object key) {
628        TreeMapEntry<K,V> p = getEntry(key);
629        if (p == null)
630            return null;
631
632        V oldValue = p.value;
633        deleteEntry(p);
634        return oldValue;
635    }
636
637    /**
638     * Removes all of the mappings from this map.
639     * The map will be empty after this call returns.
640     */
641    public void clear() {
642        modCount++;
643        size = 0;
644        root = null;
645    }
646
647    /**
648     * Returns a shallow copy of this {@code TreeMap} instance. (The keys and
649     * values themselves are not cloned.)
650     *
651     * @return a shallow copy of this map
652     */
653    public Object clone() {
654        TreeMap<?,?> clone;
655        try {
656            clone = (TreeMap<?,?>) super.clone();
657        } catch (CloneNotSupportedException e) {
658            throw new InternalError(e);
659        }
660
661        // Put clone into "virgin" state (except for comparator)
662        clone.root = null;
663        clone.size = 0;
664        clone.modCount = 0;
665        clone.entrySet = null;
666        clone.navigableKeySet = null;
667        clone.descendingMap = null;
668
669        // Initialize clone with our mappings
670        try {
671            clone.buildFromSorted(size, entrySet().iterator(), null, null);
672        } catch (java.io.IOException cannotHappen) {
673        } catch (ClassNotFoundException cannotHappen) {
674        }
675
676        return clone;
677    }
678
679    // NavigableMap API methods
680
681    /**
682     * @since 1.6
683     */
684    public Map.Entry<K,V> firstEntry() {
685        return exportEntry(getFirstEntry());
686    }
687
688    /**
689     * @since 1.6
690     */
691    public Map.Entry<K,V> lastEntry() {
692        return exportEntry(getLastEntry());
693    }
694
695    /**
696     * @since 1.6
697     */
698    public Map.Entry<K,V> pollFirstEntry() {
699        TreeMapEntry<K,V> p = getFirstEntry();
700        Map.Entry<K,V> result = exportEntry(p);
701        if (p != null)
702            deleteEntry(p);
703        return result;
704    }
705
706    /**
707     * @since 1.6
708     */
709    public Map.Entry<K,V> pollLastEntry() {
710        TreeMapEntry<K,V> p = getLastEntry();
711        Map.Entry<K,V> result = exportEntry(p);
712        if (p != null)
713            deleteEntry(p);
714        return result;
715    }
716
717    /**
718     * @throws ClassCastException {@inheritDoc}
719     * @throws NullPointerException if the specified key is null
720     *         and this map uses natural ordering, or its comparator
721     *         does not permit null keys
722     * @since 1.6
723     */
724    public Map.Entry<K,V> lowerEntry(K key) {
725        return exportEntry(getLowerEntry(key));
726    }
727
728    /**
729     * @throws ClassCastException {@inheritDoc}
730     * @throws NullPointerException if the specified key is null
731     *         and this map uses natural ordering, or its comparator
732     *         does not permit null keys
733     * @since 1.6
734     */
735    public K lowerKey(K key) {
736        return keyOrNull(getLowerEntry(key));
737    }
738
739    /**
740     * @throws ClassCastException {@inheritDoc}
741     * @throws NullPointerException if the specified key is null
742     *         and this map uses natural ordering, or its comparator
743     *         does not permit null keys
744     * @since 1.6
745     */
746    public Map.Entry<K,V> floorEntry(K key) {
747        return exportEntry(getFloorEntry(key));
748    }
749
750    /**
751     * @throws ClassCastException {@inheritDoc}
752     * @throws NullPointerException if the specified key is null
753     *         and this map uses natural ordering, or its comparator
754     *         does not permit null keys
755     * @since 1.6
756     */
757    public K floorKey(K key) {
758        return keyOrNull(getFloorEntry(key));
759    }
760
761    /**
762     * @throws ClassCastException {@inheritDoc}
763     * @throws NullPointerException if the specified key is null
764     *         and this map uses natural ordering, or its comparator
765     *         does not permit null keys
766     * @since 1.6
767     */
768    public Map.Entry<K,V> ceilingEntry(K key) {
769        return exportEntry(getCeilingEntry(key));
770    }
771
772    /**
773     * @throws ClassCastException {@inheritDoc}
774     * @throws NullPointerException if the specified key is null
775     *         and this map uses natural ordering, or its comparator
776     *         does not permit null keys
777     * @since 1.6
778     */
779    public K ceilingKey(K key) {
780        return keyOrNull(getCeilingEntry(key));
781    }
782
783    /**
784     * @throws ClassCastException {@inheritDoc}
785     * @throws NullPointerException if the specified key is null
786     *         and this map uses natural ordering, or its comparator
787     *         does not permit null keys
788     * @since 1.6
789     */
790    public Map.Entry<K,V> higherEntry(K key) {
791        return exportEntry(getHigherEntry(key));
792    }
793
794    /**
795     * @throws ClassCastException {@inheritDoc}
796     * @throws NullPointerException if the specified key is null
797     *         and this map uses natural ordering, or its comparator
798     *         does not permit null keys
799     * @since 1.6
800     */
801    public K higherKey(K key) {
802        return keyOrNull(getHigherEntry(key));
803    }
804
805    // Views
806
807    /**
808     * Fields initialized to contain an instance of the entry set view
809     * the first time this view is requested.  Views are stateless, so
810     * there's no reason to create more than one.
811     */
812    private transient EntrySet entrySet = null;
813    private transient KeySet<K> navigableKeySet = null;
814    private transient NavigableMap<K,V> descendingMap = null;
815
816    /**
817     * Returns a {@link Set} view of the keys contained in this map.
818     *
819     * <p>The set's iterator returns the keys in ascending order.
820     * The set's spliterator is
821     * <em><a href="Spliterator.html#binding">late-binding</a></em>,
822     * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED}
823     * and {@link Spliterator#ORDERED} with an encounter order that is ascending
824     * key order.  The spliterator's comparator (see
825     * {@link java.util.Spliterator#getComparator()}) is {@code null} if
826     * the tree map's comparator (see {@link #comparator()}) is {@code null}.
827     * Otherwise, the spliterator's comparator is the same as or imposes the
828     * same total ordering as the tree map's comparator.
829     *
830     * <p>The set is backed by the map, so changes to the map are
831     * reflected in the set, and vice-versa.  If the map is modified
832     * while an iteration over the set is in progress (except through
833     * the iterator's own {@code remove} operation), the results of
834     * the iteration are undefined.  The set supports element removal,
835     * which removes the corresponding mapping from the map, via the
836     * {@code Iterator.remove}, {@code Set.remove},
837     * {@code removeAll}, {@code retainAll}, and {@code clear}
838     * operations.  It does not support the {@code add} or {@code addAll}
839     * operations.
840     */
841    public Set<K> keySet() {
842        return navigableKeySet();
843    }
844
845    /**
846     * @since 1.6
847     */
848    public NavigableSet<K> navigableKeySet() {
849        KeySet<K> nks = navigableKeySet;
850        return (nks != null) ? nks : (navigableKeySet = new KeySet<>(this));
851    }
852
853    /**
854     * @since 1.6
855     */
856    public NavigableSet<K> descendingKeySet() {
857        return descendingMap().navigableKeySet();
858    }
859
860    /**
861     * Returns a {@link Collection} view of the values contained in this map.
862     *
863     * <p>The collection's iterator returns the values in ascending order
864     * of the corresponding keys. The collection's spliterator is
865     * <em><a href="Spliterator.html#binding">late-binding</a></em>,
866     * <em>fail-fast</em>, and additionally reports {@link Spliterator#ORDERED}
867     * with an encounter order that is ascending order of the corresponding
868     * keys.
869     *
870     * <p>The collection is backed by the map, so changes to the map are
871     * reflected in the collection, and vice-versa.  If the map is
872     * modified while an iteration over the collection is in progress
873     * (except through the iterator's own {@code remove} operation),
874     * the results of the iteration are undefined.  The collection
875     * supports element removal, which removes the corresponding
876     * mapping from the map, via the {@code Iterator.remove},
877     * {@code Collection.remove}, {@code removeAll},
878     * {@code retainAll} and {@code clear} operations.  It does not
879     * support the {@code add} or {@code addAll} operations.
880     */
881    public Collection<V> values() {
882        Collection<V> vs = values;
883        return (vs != null) ? vs : (values = new Values());
884    }
885
886    /**
887     * Returns a {@link Set} view of the mappings contained in this map.
888     *
889     * <p>The set's iterator returns the entries in ascending key order. The
890     * sets's spliterator is
891     * <em><a href="Spliterator.html#binding">late-binding</a></em>,
892     * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and
893     * {@link Spliterator#ORDERED} with an encounter order that is ascending key
894     * order.
895     *
896     * <p>The set is backed by the map, so changes to the map are
897     * reflected in the set, and vice-versa.  If the map is modified
898     * while an iteration over the set is in progress (except through
899     * the iterator's own {@code remove} operation, or through the
900     * {@code setValue} operation on a map entry returned by the
901     * iterator) the results of the iteration are undefined.  The set
902     * supports element removal, which removes the corresponding
903     * mapping from the map, via the {@code Iterator.remove},
904     * {@code Set.remove}, {@code removeAll}, {@code retainAll} and
905     * {@code clear} operations.  It does not support the
906     * {@code add} or {@code addAll} operations.
907     */
908    public Set<Map.Entry<K,V>> entrySet() {
909        EntrySet es = entrySet;
910        return (es != null) ? es : (entrySet = new EntrySet());
911    }
912
913    /**
914     * @since 1.6
915     */
916    public NavigableMap<K, V> descendingMap() {
917        NavigableMap<K, V> km = descendingMap;
918        return (km != null) ? km :
919            (descendingMap = new DescendingSubMap<>(this,
920                                                    true, null, true,
921                                                    true, null, true));
922    }
923
924    /**
925     * @throws ClassCastException       {@inheritDoc}
926     * @throws NullPointerException if {@code fromKey} or {@code toKey} is
927     *         null and this map uses natural ordering, or its comparator
928     *         does not permit null keys
929     * @throws IllegalArgumentException {@inheritDoc}
930     * @since 1.6
931     */
932    public NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
933                                    K toKey,   boolean toInclusive) {
934        return new AscendingSubMap<>(this,
935                                     false, fromKey, fromInclusive,
936                                     false, toKey,   toInclusive);
937    }
938
939    /**
940     * @throws ClassCastException       {@inheritDoc}
941     * @throws NullPointerException if {@code toKey} is null
942     *         and this map uses natural ordering, or its comparator
943     *         does not permit null keys
944     * @throws IllegalArgumentException {@inheritDoc}
945     * @since 1.6
946     */
947    public NavigableMap<K,V> headMap(K toKey, boolean inclusive) {
948        return new AscendingSubMap<>(this,
949                                     true,  null,  true,
950                                     false, toKey, inclusive);
951    }
952
953    /**
954     * @throws ClassCastException       {@inheritDoc}
955     * @throws NullPointerException if {@code fromKey} is null
956     *         and this map uses natural ordering, or its comparator
957     *         does not permit null keys
958     * @throws IllegalArgumentException {@inheritDoc}
959     * @since 1.6
960     */
961    public NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) {
962        return new AscendingSubMap<>(this,
963                                     false, fromKey, inclusive,
964                                     true,  null,    true);
965    }
966
967    /**
968     * @throws ClassCastException       {@inheritDoc}
969     * @throws NullPointerException if {@code fromKey} or {@code toKey} is
970     *         null and this map uses natural ordering, or its comparator
971     *         does not permit null keys
972     * @throws IllegalArgumentException {@inheritDoc}
973     */
974    public SortedMap<K,V> subMap(K fromKey, K toKey) {
975        return subMap(fromKey, true, toKey, false);
976    }
977
978    /**
979     * @throws ClassCastException       {@inheritDoc}
980     * @throws NullPointerException if {@code toKey} is null
981     *         and this map uses natural ordering, or its comparator
982     *         does not permit null keys
983     * @throws IllegalArgumentException {@inheritDoc}
984     */
985    public SortedMap<K,V> headMap(K toKey) {
986        return headMap(toKey, false);
987    }
988
989    /**
990     * @throws ClassCastException       {@inheritDoc}
991     * @throws NullPointerException if {@code fromKey} is null
992     *         and this map uses natural ordering, or its comparator
993     *         does not permit null keys
994     * @throws IllegalArgumentException {@inheritDoc}
995     */
996    public SortedMap<K,V> tailMap(K fromKey) {
997        return tailMap(fromKey, true);
998    }
999
1000    @Override
1001    public void forEach(BiConsumer<? super K, ? super V> action) {
1002        Objects.requireNonNull(action);
1003        int expectedModCount = modCount;
1004        for (TreeMapEntry<K, V> e = getFirstEntry(); e != null; e = successor(e)) {
1005            action.accept(e.key, e.value);
1006
1007            if (expectedModCount != modCount) {
1008                throw new ConcurrentModificationException();
1009            }
1010        }
1011    }
1012
1013    // View class support
1014
1015    class Values extends AbstractCollection<V> {
1016        public Iterator<V> iterator() {
1017            return new ValueIterator(getFirstEntry());
1018        }
1019
1020        public int size() {
1021            return TreeMap.this.size();
1022        }
1023
1024        public boolean contains(Object o) {
1025            return TreeMap.this.containsValue(o);
1026        }
1027
1028        public boolean remove(Object o) {
1029            for (TreeMapEntry<K,V> e = getFirstEntry(); e != null; e = successor(e)) {
1030                if (valEquals(e.getValue(), o)) {
1031                    deleteEntry(e);
1032                    return true;
1033                }
1034            }
1035            return false;
1036        }
1037
1038        public void clear() {
1039            TreeMap.this.clear();
1040        }
1041
1042        public Spliterator<V> spliterator() {
1043            return new ValueSpliterator<K,V>(TreeMap.this, null, null, 0, -1, 0);
1044        }
1045    }
1046
1047    class EntrySet extends AbstractSet<Map.Entry<K,V>> {
1048        public Iterator<Map.Entry<K,V>> iterator() {
1049            return new EntryIterator(getFirstEntry());
1050        }
1051
1052        public boolean contains(Object o) {
1053            if (!(o instanceof Map.Entry))
1054                return false;
1055            Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1056            V value = entry.getValue();
1057            TreeMapEntry<K,V> p = getEntry(entry.getKey());
1058            return p != null && valEquals(p.getValue(), value);
1059        }
1060
1061        public boolean remove(Object o) {
1062            if (!(o instanceof Map.Entry))
1063                return false;
1064            Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1065            V value = entry.getValue();
1066            TreeMapEntry<K,V> p = getEntry(entry.getKey());
1067            if (p != null && valEquals(p.getValue(), value)) {
1068                deleteEntry(p);
1069                return true;
1070            }
1071            return false;
1072        }
1073
1074        public int size() {
1075            return TreeMap.this.size();
1076        }
1077
1078        public void clear() {
1079            TreeMap.this.clear();
1080        }
1081
1082        public Spliterator<Map.Entry<K,V>> spliterator() {
1083            return new EntrySpliterator<K,V>(TreeMap.this, null, null, 0, -1, 0);
1084        }
1085    }
1086
1087    /*
1088     * Unlike Values and EntrySet, the KeySet class is static,
1089     * delegating to a NavigableMap to allow use by SubMaps, which
1090     * outweighs the ugliness of needing type-tests for the following
1091     * Iterator methods that are defined appropriately in main versus
1092     * submap classes.
1093     */
1094
1095    Iterator<K> keyIterator() {
1096        return new KeyIterator(getFirstEntry());
1097    }
1098
1099    Iterator<K> descendingKeyIterator() {
1100        return new DescendingKeyIterator(getLastEntry());
1101    }
1102
1103    static final class KeySet<E> extends AbstractSet<E> implements NavigableSet<E> {
1104        private final NavigableMap<E, ?> m;
1105        KeySet(NavigableMap<E,?> map) { m = map; }
1106
1107        public Iterator<E> iterator() {
1108            if (m instanceof TreeMap)
1109                return ((TreeMap<E,?>)m).keyIterator();
1110            else
1111                return ((TreeMap.NavigableSubMap<E,?>)m).keyIterator();
1112        }
1113
1114        public Iterator<E> descendingIterator() {
1115            if (m instanceof TreeMap)
1116                return ((TreeMap<E,?>)m).descendingKeyIterator();
1117            else
1118                return ((TreeMap.NavigableSubMap<E,?>)m).descendingKeyIterator();
1119        }
1120
1121        public int size() { return m.size(); }
1122        public boolean isEmpty() { return m.isEmpty(); }
1123        public boolean contains(Object o) { return m.containsKey(o); }
1124        public void clear() { m.clear(); }
1125        public E lower(E e) { return m.lowerKey(e); }
1126        public E floor(E e) { return m.floorKey(e); }
1127        public E ceiling(E e) { return m.ceilingKey(e); }
1128        public E higher(E e) { return m.higherKey(e); }
1129        public E first() { return m.firstKey(); }
1130        public E last() { return m.lastKey(); }
1131        public Comparator<? super E> comparator() { return m.comparator(); }
1132        public E pollFirst() {
1133            Map.Entry<E,?> e = m.pollFirstEntry();
1134            return (e == null) ? null : e.getKey();
1135        }
1136        public E pollLast() {
1137            Map.Entry<E,?> e = m.pollLastEntry();
1138            return (e == null) ? null : e.getKey();
1139        }
1140        public boolean remove(Object o) {
1141            int oldSize = size();
1142            m.remove(o);
1143            return size() != oldSize;
1144        }
1145        public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
1146                                      E toElement,   boolean toInclusive) {
1147            return new KeySet<>(m.subMap(fromElement, fromInclusive,
1148                                          toElement,   toInclusive));
1149        }
1150        public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1151            return new KeySet<>(m.headMap(toElement, inclusive));
1152        }
1153        public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1154            return new KeySet<>(m.tailMap(fromElement, inclusive));
1155        }
1156        public SortedSet<E> subSet(E fromElement, E toElement) {
1157            return subSet(fromElement, true, toElement, false);
1158        }
1159        public SortedSet<E> headSet(E toElement) {
1160            return headSet(toElement, false);
1161        }
1162        public SortedSet<E> tailSet(E fromElement) {
1163            return tailSet(fromElement, true);
1164        }
1165        public NavigableSet<E> descendingSet() {
1166            return new KeySet<>(m.descendingMap());
1167        }
1168
1169        public Spliterator<E> spliterator() {
1170            return keySpliteratorFor(m);
1171        }
1172    }
1173
1174    /**
1175     * Base class for TreeMap Iterators
1176     */
1177    abstract class PrivateEntryIterator<T> implements Iterator<T> {
1178        TreeMapEntry<K,V> next;
1179        TreeMapEntry<K,V> lastReturned;
1180        int expectedModCount;
1181
1182        PrivateEntryIterator(TreeMapEntry<K,V> first) {
1183            expectedModCount = modCount;
1184            lastReturned = null;
1185            next = first;
1186        }
1187
1188        public final boolean hasNext() {
1189            return next != null;
1190        }
1191
1192        final TreeMapEntry<K,V> nextEntry() {
1193            TreeMapEntry<K,V> e = next;
1194            if (e == null)
1195                throw new NoSuchElementException();
1196            if (modCount != expectedModCount)
1197                throw new ConcurrentModificationException();
1198            next = successor(e);
1199            lastReturned = e;
1200            return e;
1201        }
1202
1203        final TreeMapEntry<K,V> prevEntry() {
1204            TreeMapEntry<K,V> e = next;
1205            if (e == null)
1206                throw new NoSuchElementException();
1207            if (modCount != expectedModCount)
1208                throw new ConcurrentModificationException();
1209            next = predecessor(e);
1210            lastReturned = e;
1211            return e;
1212        }
1213
1214        public void remove() {
1215            if (lastReturned == null)
1216                throw new IllegalStateException();
1217            if (modCount != expectedModCount)
1218                throw new ConcurrentModificationException();
1219            // deleted entries are replaced by their successors
1220            if (lastReturned.left != null && lastReturned.right != null)
1221                next = lastReturned;
1222            deleteEntry(lastReturned);
1223            expectedModCount = modCount;
1224            lastReturned = null;
1225        }
1226    }
1227
1228    final class EntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {
1229        EntryIterator(TreeMapEntry<K,V> first) {
1230            super(first);
1231        }
1232        public Map.Entry<K,V> next() {
1233            return nextEntry();
1234        }
1235    }
1236
1237    final class ValueIterator extends PrivateEntryIterator<V> {
1238        ValueIterator(TreeMapEntry<K,V> first) {
1239            super(first);
1240        }
1241        public V next() {
1242            return nextEntry().value;
1243        }
1244    }
1245
1246    final class KeyIterator extends PrivateEntryIterator<K> {
1247        KeyIterator(TreeMapEntry<K,V> first) {
1248            super(first);
1249        }
1250        public K next() {
1251            return nextEntry().key;
1252        }
1253    }
1254
1255    final class DescendingKeyIterator extends PrivateEntryIterator<K> {
1256        DescendingKeyIterator(TreeMapEntry<K,V> first) {
1257            super(first);
1258        }
1259        public K next() {
1260            return prevEntry().key;
1261        }
1262        public void remove() {
1263            if (lastReturned == null)
1264                throw new IllegalStateException();
1265            if (modCount != expectedModCount)
1266                throw new ConcurrentModificationException();
1267            deleteEntry(lastReturned);
1268            lastReturned = null;
1269            expectedModCount = modCount;
1270        }
1271    }
1272
1273    // Little utilities
1274
1275    /**
1276     * Compares two keys using the correct comparison method for this TreeMap.
1277     */
1278    @SuppressWarnings("unchecked")
1279    final int compare(Object k1, Object k2) {
1280        return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
1281            : comparator.compare((K)k1, (K)k2);
1282    }
1283
1284    /**
1285     * Test two values for equality.  Differs from o1.equals(o2) only in
1286     * that it copes with {@code null} o1 properly.
1287     */
1288    static final boolean valEquals(Object o1, Object o2) {
1289        return (o1==null ? o2==null : o1.equals(o2));
1290    }
1291
1292    /**
1293     * Return SimpleImmutableEntry for entry, or null if null
1294     */
1295    static <K,V> Map.Entry<K,V> exportEntry(TreeMapEntry<K,V> e) {
1296        return (e == null) ? null :
1297            new AbstractMap.SimpleImmutableEntry<>(e);
1298    }
1299
1300    /**
1301     * Return key for entry, or null if null
1302     */
1303    static <K,V> K keyOrNull(TreeMapEntry<K,V> e) {
1304        return (e == null) ? null : e.key;
1305    }
1306
1307    /**
1308     * Returns the key corresponding to the specified Entry.
1309     * @throws NoSuchElementException if the Entry is null
1310     */
1311    static <K> K key(TreeMapEntry<K,?> e) {
1312        if (e==null)
1313            throw new NoSuchElementException();
1314        return e.key;
1315    }
1316
1317
1318    // SubMaps
1319
1320    /**
1321     * Dummy value serving as unmatchable fence key for unbounded
1322     * SubMapIterators
1323     */
1324    private static final Object UNBOUNDED = new Object();
1325
1326    /**
1327     * @serial include
1328     */
1329    abstract static class NavigableSubMap<K,V> extends AbstractMap<K,V>
1330        implements NavigableMap<K,V>, java.io.Serializable {
1331        /**
1332         * The backing map.
1333         */
1334        final TreeMap<K,V> m;
1335
1336        /**
1337         * Endpoints are represented as triples (fromStart, lo,
1338         * loInclusive) and (toEnd, hi, hiInclusive). If fromStart is
1339         * true, then the low (absolute) bound is the start of the
1340         * backing map, and the other values are ignored. Otherwise,
1341         * if loInclusive is true, lo is the inclusive bound, else lo
1342         * is the exclusive bound. Similarly for the upper bound.
1343         */
1344        final K lo, hi;
1345        final boolean fromStart, toEnd;
1346        final boolean loInclusive, hiInclusive;
1347
1348        NavigableSubMap(TreeMap<K,V> m,
1349                        boolean fromStart, K lo, boolean loInclusive,
1350                        boolean toEnd,     K hi, boolean hiInclusive) {
1351            if (!fromStart && !toEnd) {
1352                if (m.compare(lo, hi) > 0)
1353                    throw new IllegalArgumentException("fromKey > toKey");
1354            } else {
1355                if (!fromStart) // type check
1356                    m.compare(lo, lo);
1357                if (!toEnd)
1358                    m.compare(hi, hi);
1359            }
1360
1361            this.m = m;
1362            this.fromStart = fromStart;
1363            this.lo = lo;
1364            this.loInclusive = loInclusive;
1365            this.toEnd = toEnd;
1366            this.hi = hi;
1367            this.hiInclusive = hiInclusive;
1368        }
1369
1370        // internal utilities
1371
1372        final boolean tooLow(Object key) {
1373            if (!fromStart) {
1374                int c = m.compare(key, lo);
1375                if (c < 0 || (c == 0 && !loInclusive))
1376                    return true;
1377            }
1378            return false;
1379        }
1380
1381        final boolean tooHigh(Object key) {
1382            if (!toEnd) {
1383                int c = m.compare(key, hi);
1384                if (c > 0 || (c == 0 && !hiInclusive))
1385                    return true;
1386            }
1387            return false;
1388        }
1389
1390        final boolean inRange(Object key) {
1391            return !tooLow(key) && !tooHigh(key);
1392        }
1393
1394        final boolean inClosedRange(Object key) {
1395            return (fromStart || m.compare(key, lo) >= 0)
1396                && (toEnd || m.compare(hi, key) >= 0);
1397        }
1398
1399        final boolean inRange(Object key, boolean inclusive) {
1400            return inclusive ? inRange(key) : inClosedRange(key);
1401        }
1402
1403        /*
1404         * Absolute versions of relation operations.
1405         * Subclasses map to these using like-named "sub"
1406         * versions that invert senses for descending maps
1407         */
1408
1409        final TreeMapEntry<K,V> absLowest() {
1410            TreeMapEntry<K,V> e =
1411                (fromStart ?  m.getFirstEntry() :
1412                 (loInclusive ? m.getCeilingEntry(lo) :
1413                                m.getHigherEntry(lo)));
1414            return (e == null || tooHigh(e.key)) ? null : e;
1415        }
1416
1417        final TreeMapEntry<K,V> absHighest() {
1418            TreeMapEntry<K,V> e =
1419                (toEnd ?  m.getLastEntry() :
1420                 (hiInclusive ?  m.getFloorEntry(hi) :
1421                                 m.getLowerEntry(hi)));
1422            return (e == null || tooLow(e.key)) ? null : e;
1423        }
1424
1425        final TreeMapEntry<K,V> absCeiling(K key) {
1426            if (tooLow(key))
1427                return absLowest();
1428            TreeMapEntry<K,V> e = m.getCeilingEntry(key);
1429            return (e == null || tooHigh(e.key)) ? null : e;
1430        }
1431
1432        final TreeMapEntry<K,V> absHigher(K key) {
1433            if (tooLow(key))
1434                return absLowest();
1435            TreeMapEntry<K,V> e = m.getHigherEntry(key);
1436            return (e == null || tooHigh(e.key)) ? null : e;
1437        }
1438
1439        final TreeMapEntry<K,V> absFloor(K key) {
1440            if (tooHigh(key))
1441                return absHighest();
1442            TreeMapEntry<K,V> e = m.getFloorEntry(key);
1443            return (e == null || tooLow(e.key)) ? null : e;
1444        }
1445
1446        final TreeMapEntry<K,V> absLower(K key) {
1447            if (tooHigh(key))
1448                return absHighest();
1449            TreeMapEntry<K,V> e = m.getLowerEntry(key);
1450            return (e == null || tooLow(e.key)) ? null : e;
1451        }
1452
1453        /** Returns the absolute high fence for ascending traversal */
1454        final TreeMapEntry<K,V> absHighFence() {
1455            return (toEnd ? null : (hiInclusive ?
1456                                    m.getHigherEntry(hi) :
1457                                    m.getCeilingEntry(hi)));
1458        }
1459
1460        /** Return the absolute low fence for descending traversal  */
1461        final TreeMapEntry<K,V> absLowFence() {
1462            return (fromStart ? null : (loInclusive ?
1463                                        m.getLowerEntry(lo) :
1464                                        m.getFloorEntry(lo)));
1465        }
1466
1467        // Abstract methods defined in ascending vs descending classes
1468        // These relay to the appropriate absolute versions
1469
1470        abstract TreeMapEntry<K,V> subLowest();
1471        abstract TreeMapEntry<K,V> subHighest();
1472        abstract TreeMapEntry<K,V> subCeiling(K key);
1473        abstract TreeMapEntry<K,V> subHigher(K key);
1474        abstract TreeMapEntry<K,V> subFloor(K key);
1475        abstract TreeMapEntry<K,V> subLower(K key);
1476
1477        /** Returns ascending iterator from the perspective of this submap */
1478        abstract Iterator<K> keyIterator();
1479
1480        abstract Spliterator<K> keySpliterator();
1481
1482        /** Returns descending iterator from the perspective of this submap */
1483        abstract Iterator<K> descendingKeyIterator();
1484
1485        // public methods
1486
1487        public boolean isEmpty() {
1488            return (fromStart && toEnd) ? m.isEmpty() : entrySet().isEmpty();
1489        }
1490
1491        public int size() {
1492            return (fromStart && toEnd) ? m.size() : entrySet().size();
1493        }
1494
1495        public final boolean containsKey(Object key) {
1496            return inRange(key) && m.containsKey(key);
1497        }
1498
1499        public final V put(K key, V value) {
1500            if (!inRange(key))
1501                throw new IllegalArgumentException("key out of range");
1502            return m.put(key, value);
1503        }
1504
1505        public final V get(Object key) {
1506            return !inRange(key) ? null :  m.get(key);
1507        }
1508
1509        public final V remove(Object key) {
1510            return !inRange(key) ? null : m.remove(key);
1511        }
1512
1513        public final Map.Entry<K,V> ceilingEntry(K key) {
1514            return exportEntry(subCeiling(key));
1515        }
1516
1517        public final K ceilingKey(K key) {
1518            return keyOrNull(subCeiling(key));
1519        }
1520
1521        public final Map.Entry<K,V> higherEntry(K key) {
1522            return exportEntry(subHigher(key));
1523        }
1524
1525        public final K higherKey(K key) {
1526            return keyOrNull(subHigher(key));
1527        }
1528
1529        public final Map.Entry<K,V> floorEntry(K key) {
1530            return exportEntry(subFloor(key));
1531        }
1532
1533        public final K floorKey(K key) {
1534            return keyOrNull(subFloor(key));
1535        }
1536
1537        public final Map.Entry<K,V> lowerEntry(K key) {
1538            return exportEntry(subLower(key));
1539        }
1540
1541        public final K lowerKey(K key) {
1542            return keyOrNull(subLower(key));
1543        }
1544
1545        public final K firstKey() {
1546            return key(subLowest());
1547        }
1548
1549        public final K lastKey() {
1550            return key(subHighest());
1551        }
1552
1553        public final Map.Entry<K,V> firstEntry() {
1554            return exportEntry(subLowest());
1555        }
1556
1557        public final Map.Entry<K,V> lastEntry() {
1558            return exportEntry(subHighest());
1559        }
1560
1561        public final Map.Entry<K,V> pollFirstEntry() {
1562            TreeMapEntry<K,V> e = subLowest();
1563            Map.Entry<K,V> result = exportEntry(e);
1564            if (e != null)
1565                m.deleteEntry(e);
1566            return result;
1567        }
1568
1569        public final Map.Entry<K,V> pollLastEntry() {
1570            TreeMapEntry<K,V> e = subHighest();
1571            Map.Entry<K,V> result = exportEntry(e);
1572            if (e != null)
1573                m.deleteEntry(e);
1574            return result;
1575        }
1576
1577        // Views
1578        transient NavigableMap<K,V> descendingMapView = null;
1579        transient EntrySetView entrySetView = null;
1580        transient KeySet<K> navigableKeySetView = null;
1581
1582        public final NavigableSet<K> navigableKeySet() {
1583            KeySet<K> nksv = navigableKeySetView;
1584            return (nksv != null) ? nksv :
1585                (navigableKeySetView = new TreeMap.KeySet<>(this));
1586        }
1587
1588        public final Set<K> keySet() {
1589            return navigableKeySet();
1590        }
1591
1592        public NavigableSet<K> descendingKeySet() {
1593            return descendingMap().navigableKeySet();
1594        }
1595
1596        public final SortedMap<K,V> subMap(K fromKey, K toKey) {
1597            return subMap(fromKey, true, toKey, false);
1598        }
1599
1600        public final SortedMap<K,V> headMap(K toKey) {
1601            return headMap(toKey, false);
1602        }
1603
1604        public final SortedMap<K,V> tailMap(K fromKey) {
1605            return tailMap(fromKey, true);
1606        }
1607
1608        // View classes
1609
1610        abstract class EntrySetView extends AbstractSet<Map.Entry<K,V>> {
1611            private transient int size = -1, sizeModCount;
1612
1613            public int size() {
1614                if (fromStart && toEnd)
1615                    return m.size();
1616                if (size == -1 || sizeModCount != m.modCount) {
1617                    sizeModCount = m.modCount;
1618                    size = 0;
1619                    Iterator<?> i = iterator();
1620                    while (i.hasNext()) {
1621                        size++;
1622                        i.next();
1623                    }
1624                }
1625                return size;
1626            }
1627
1628            public boolean isEmpty() {
1629                TreeMapEntry<K,V> n = absLowest();
1630                return n == null || tooHigh(n.key);
1631            }
1632
1633            public boolean contains(Object o) {
1634                if (!(o instanceof Map.Entry))
1635                    return false;
1636                Map.Entry<?,?> entry = (Map.Entry<?,?>) o;
1637                Object key = entry.getKey();
1638                if (!inRange(key))
1639                    return false;
1640                TreeMapEntry<?, ?> node = m.getEntry(key);
1641                return node != null &&
1642                    valEquals(node.getValue(), entry.getValue());
1643            }
1644
1645            public boolean remove(Object o) {
1646                if (!(o instanceof Map.Entry))
1647                    return false;
1648                Map.Entry<?,?> entry = (Map.Entry<?,?>) o;
1649                Object key = entry.getKey();
1650                if (!inRange(key))
1651                    return false;
1652                TreeMapEntry<K,V> node = m.getEntry(key);
1653                if (node!=null && valEquals(node.getValue(),
1654                                            entry.getValue())) {
1655                    m.deleteEntry(node);
1656                    return true;
1657                }
1658                return false;
1659            }
1660        }
1661
1662        /**
1663         * Iterators for SubMaps
1664         */
1665        abstract class SubMapIterator<T> implements Iterator<T> {
1666            TreeMapEntry<K,V> lastReturned;
1667            TreeMapEntry<K,V> next;
1668            final Object fenceKey;
1669            int expectedModCount;
1670
1671            SubMapIterator(TreeMapEntry<K,V> first,
1672                           TreeMapEntry<K,V> fence) {
1673                expectedModCount = m.modCount;
1674                lastReturned = null;
1675                next = first;
1676                fenceKey = fence == null ? UNBOUNDED : fence.key;
1677            }
1678
1679            public final boolean hasNext() {
1680                return next != null && next.key != fenceKey;
1681            }
1682
1683            final TreeMapEntry<K,V> nextEntry() {
1684                TreeMapEntry<K,V> e = next;
1685                if (e == null || e.key == fenceKey)
1686                    throw new NoSuchElementException();
1687                if (m.modCount != expectedModCount)
1688                    throw new ConcurrentModificationException();
1689                next = successor(e);
1690                lastReturned = e;
1691                return e;
1692            }
1693
1694            final TreeMapEntry<K,V> prevEntry() {
1695                TreeMapEntry<K,V> e = next;
1696                if (e == null || e.key == fenceKey)
1697                    throw new NoSuchElementException();
1698                if (m.modCount != expectedModCount)
1699                    throw new ConcurrentModificationException();
1700                next = predecessor(e);
1701                lastReturned = e;
1702                return e;
1703            }
1704
1705            final void removeAscending() {
1706                if (lastReturned == null)
1707                    throw new IllegalStateException();
1708                if (m.modCount != expectedModCount)
1709                    throw new ConcurrentModificationException();
1710                // deleted entries are replaced by their successors
1711                if (lastReturned.left != null && lastReturned.right != null)
1712                    next = lastReturned;
1713                m.deleteEntry(lastReturned);
1714                lastReturned = null;
1715                expectedModCount = m.modCount;
1716            }
1717
1718            final void removeDescending() {
1719                if (lastReturned == null)
1720                    throw new IllegalStateException();
1721                if (m.modCount != expectedModCount)
1722                    throw new ConcurrentModificationException();
1723                m.deleteEntry(lastReturned);
1724                lastReturned = null;
1725                expectedModCount = m.modCount;
1726            }
1727
1728        }
1729
1730        final class SubMapEntryIterator extends SubMapIterator<Map.Entry<K,V>> {
1731            SubMapEntryIterator(TreeMapEntry<K,V> first,
1732                                TreeMapEntry<K,V> fence) {
1733                super(first, fence);
1734            }
1735            public Map.Entry<K,V> next() {
1736                return nextEntry();
1737            }
1738            public void remove() {
1739                removeAscending();
1740            }
1741        }
1742
1743        final class DescendingSubMapEntryIterator extends SubMapIterator<Map.Entry<K,V>> {
1744            DescendingSubMapEntryIterator(TreeMapEntry<K,V> last,
1745                                          TreeMapEntry<K,V> fence) {
1746                super(last, fence);
1747            }
1748
1749            public Map.Entry<K,V> next() {
1750                return prevEntry();
1751            }
1752            public void remove() {
1753                removeDescending();
1754            }
1755        }
1756
1757        // Implement minimal Spliterator as KeySpliterator backup
1758        final class SubMapKeyIterator extends SubMapIterator<K>
1759            implements Spliterator<K> {
1760            SubMapKeyIterator(TreeMapEntry<K,V> first,
1761                              TreeMapEntry<K,V> fence) {
1762                super(first, fence);
1763            }
1764            public K next() {
1765                return nextEntry().key;
1766            }
1767            public void remove() {
1768                removeAscending();
1769            }
1770            public Spliterator<K> trySplit() {
1771                return null;
1772            }
1773            public void forEachRemaining(Consumer<? super K> action) {
1774                while (hasNext())
1775                    action.accept(next());
1776            }
1777            public boolean tryAdvance(Consumer<? super K> action) {
1778                if (hasNext()) {
1779                    action.accept(next());
1780                    return true;
1781                }
1782                return false;
1783            }
1784            public long estimateSize() {
1785                return Long.MAX_VALUE;
1786            }
1787            public int characteristics() {
1788                return Spliterator.DISTINCT | Spliterator.ORDERED |
1789                    Spliterator.SORTED;
1790            }
1791            public final Comparator<? super K>  getComparator() {
1792                return NavigableSubMap.this.comparator();
1793            }
1794        }
1795
1796        final class DescendingSubMapKeyIterator extends SubMapIterator<K>
1797            implements Spliterator<K> {
1798            DescendingSubMapKeyIterator(TreeMapEntry<K,V> last,
1799                                        TreeMapEntry<K,V> fence) {
1800                super(last, fence);
1801            }
1802            public K next() {
1803                return prevEntry().key;
1804            }
1805            public void remove() {
1806                removeDescending();
1807            }
1808            public Spliterator<K> trySplit() {
1809                return null;
1810            }
1811            public void forEachRemaining(Consumer<? super K> action) {
1812                while (hasNext())
1813                    action.accept(next());
1814            }
1815            public boolean tryAdvance(Consumer<? super K> action) {
1816                if (hasNext()) {
1817                    action.accept(next());
1818                    return true;
1819                }
1820                return false;
1821            }
1822            public long estimateSize() {
1823                return Long.MAX_VALUE;
1824            }
1825            public int characteristics() {
1826                return Spliterator.DISTINCT | Spliterator.ORDERED;
1827            }
1828        }
1829    }
1830
1831    /**
1832     * @serial include
1833     */
1834    static final class AscendingSubMap<K,V> extends NavigableSubMap<K,V> {
1835        private static final long serialVersionUID = 912986545866124060L;
1836
1837        AscendingSubMap(TreeMap<K,V> m,
1838                        boolean fromStart, K lo, boolean loInclusive,
1839                        boolean toEnd,     K hi, boolean hiInclusive) {
1840            super(m, fromStart, lo, loInclusive, toEnd, hi, hiInclusive);
1841        }
1842
1843        public Comparator<? super K> comparator() {
1844            return m.comparator();
1845        }
1846
1847        public NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
1848                                        K toKey,   boolean toInclusive) {
1849            if (!inRange(fromKey, fromInclusive))
1850                throw new IllegalArgumentException("fromKey out of range");
1851            if (!inRange(toKey, toInclusive))
1852                throw new IllegalArgumentException("toKey out of range");
1853            return new AscendingSubMap<>(m,
1854                                         false, fromKey, fromInclusive,
1855                                         false, toKey,   toInclusive);
1856        }
1857
1858        public NavigableMap<K,V> headMap(K toKey, boolean inclusive) {
1859            /* ----- BEGIN android -----
1860               Fix for edge cases
1861               if (!inRange(toKey, inclusive)) */
1862            if (!inRange(toKey) && !(!toEnd && m.compare(toKey, hi) == 0 &&
1863                !hiInclusive && !inclusive))
1864            // ----- END android -----
1865                throw new IllegalArgumentException("toKey out of range");
1866            return new AscendingSubMap<>(m,
1867                                         fromStart, lo,    loInclusive,
1868                                         false,     toKey, inclusive);
1869        }
1870
1871        public NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) {
1872            /* ----- BEGIN android -----
1873               Fix for edge cases
1874               if (!inRange(fromKey, inclusive)) */
1875            if (!inRange(fromKey) && !(!fromStart && m.compare(fromKey, lo) == 0 &&
1876                !loInclusive && !inclusive))
1877            // ----- END android -----
1878                throw new IllegalArgumentException("fromKey out of range");
1879            return new AscendingSubMap<>(m,
1880                                         false, fromKey, inclusive,
1881                                         toEnd, hi,      hiInclusive);
1882        }
1883
1884        public NavigableMap<K,V> descendingMap() {
1885            NavigableMap<K,V> mv = descendingMapView;
1886            return (mv != null) ? mv :
1887                (descendingMapView =
1888                 new DescendingSubMap<>(m,
1889                                        fromStart, lo, loInclusive,
1890                                        toEnd,     hi, hiInclusive));
1891        }
1892
1893        Iterator<K> keyIterator() {
1894            return new SubMapKeyIterator(absLowest(), absHighFence());
1895        }
1896
1897        Spliterator<K> keySpliterator() {
1898            return new SubMapKeyIterator(absLowest(), absHighFence());
1899        }
1900
1901        Iterator<K> descendingKeyIterator() {
1902            return new DescendingSubMapKeyIterator(absHighest(), absLowFence());
1903        }
1904
1905        final class AscendingEntrySetView extends EntrySetView {
1906            public Iterator<Map.Entry<K,V>> iterator() {
1907                return new SubMapEntryIterator(absLowest(), absHighFence());
1908            }
1909        }
1910
1911        public Set<Map.Entry<K,V>> entrySet() {
1912            EntrySetView es = entrySetView;
1913            return (es != null) ? es : new AscendingEntrySetView();
1914        }
1915
1916        TreeMapEntry<K,V> subLowest()       { return absLowest(); }
1917        TreeMapEntry<K,V> subHighest()      { return absHighest(); }
1918        TreeMapEntry<K,V> subCeiling(K key) { return absCeiling(key); }
1919        TreeMapEntry<K,V> subHigher(K key)  { return absHigher(key); }
1920        TreeMapEntry<K,V> subFloor(K key)   { return absFloor(key); }
1921        TreeMapEntry<K,V> subLower(K key)   { return absLower(key); }
1922    }
1923
1924    /**
1925     * @serial include
1926     */
1927    static final class DescendingSubMap<K,V>  extends NavigableSubMap<K,V> {
1928        private static final long serialVersionUID = 912986545866120460L;
1929        DescendingSubMap(TreeMap<K,V> m,
1930                        boolean fromStart, K lo, boolean loInclusive,
1931                        boolean toEnd,     K hi, boolean hiInclusive) {
1932            super(m, fromStart, lo, loInclusive, toEnd, hi, hiInclusive);
1933        }
1934
1935        private final Comparator<? super K> reverseComparator =
1936            Collections.reverseOrder(m.comparator);
1937
1938        public Comparator<? super K> comparator() {
1939            return reverseComparator;
1940        }
1941
1942        public NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
1943                                        K toKey,   boolean toInclusive) {
1944            if (!inRange(fromKey, fromInclusive))
1945                throw new IllegalArgumentException("fromKey out of range");
1946            if (!inRange(toKey, toInclusive))
1947                throw new IllegalArgumentException("toKey out of range");
1948            return new DescendingSubMap<>(m,
1949                                          false, toKey,   toInclusive,
1950                                          false, fromKey, fromInclusive);
1951        }
1952
1953        public NavigableMap<K,V> headMap(K toKey, boolean inclusive) {
1954            /* ----- BEGIN android -----
1955               Fix for edge cases
1956               if (!inRange(toKey, inclusive)) */
1957            if (!inRange(toKey) && !(!fromStart && m.compare(toKey, lo) == 0 &&
1958                !loInclusive && !inclusive))
1959            // ----- END android -----
1960                throw new IllegalArgumentException("toKey out of range");
1961            return new DescendingSubMap<>(m,
1962                                          false, toKey, inclusive,
1963                                          toEnd, hi,    hiInclusive);
1964        }
1965
1966        public NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) {
1967            /* ----- BEGIN android -----
1968               Fix for edge cases
1969               if (!inRange(fromKey, inclusive)) */
1970            if (!inRange(fromKey) && !(!toEnd && m.compare(fromKey, hi) == 0 &&
1971                !hiInclusive && !inclusive))
1972            // ----- END android -----
1973                throw new IllegalArgumentException("fromKey out of range");
1974            return new DescendingSubMap<>(m,
1975                                          fromStart, lo, loInclusive,
1976                                          false, fromKey, inclusive);
1977        }
1978
1979        public NavigableMap<K,V> descendingMap() {
1980            NavigableMap<K,V> mv = descendingMapView;
1981            return (mv != null) ? mv :
1982                (descendingMapView =
1983                 new AscendingSubMap<>(m,
1984                                       fromStart, lo, loInclusive,
1985                                       toEnd,     hi, hiInclusive));
1986        }
1987
1988        Iterator<K> keyIterator() {
1989            return new DescendingSubMapKeyIterator(absHighest(), absLowFence());
1990        }
1991
1992        Spliterator<K> keySpliterator() {
1993            return new DescendingSubMapKeyIterator(absHighest(), absLowFence());
1994        }
1995
1996        Iterator<K> descendingKeyIterator() {
1997            return new SubMapKeyIterator(absLowest(), absHighFence());
1998        }
1999
2000        final class DescendingEntrySetView extends EntrySetView {
2001            public Iterator<Map.Entry<K,V>> iterator() {
2002                return new DescendingSubMapEntryIterator(absHighest(), absLowFence());
2003            }
2004        }
2005
2006        public Set<Map.Entry<K,V>> entrySet() {
2007            EntrySetView es = entrySetView;
2008            return (es != null) ? es : (entrySetView = new DescendingEntrySetView());
2009        }
2010
2011        TreeMapEntry<K,V> subLowest()       { return absHighest(); }
2012        TreeMapEntry<K,V> subHighest()      { return absLowest(); }
2013        TreeMapEntry<K,V> subCeiling(K key) { return absFloor(key); }
2014        TreeMapEntry<K,V> subHigher(K key)  { return absLower(key); }
2015        TreeMapEntry<K,V> subFloor(K key)   { return absCeiling(key); }
2016        TreeMapEntry<K,V> subLower(K key)   { return absHigher(key); }
2017    }
2018
2019    /**
2020     * This class exists solely for the sake of serialization
2021     * compatibility with previous releases of TreeMap that did not
2022     * support NavigableMap.  It translates an old-version SubMap into
2023     * a new-version AscendingSubMap. This class is never otherwise
2024     * used.
2025     *
2026     * @serial include
2027     */
2028    private class SubMap extends AbstractMap<K,V>
2029        implements SortedMap<K,V>, java.io.Serializable {
2030        private static final long serialVersionUID = -6520786458950516097L;
2031        private boolean fromStart = false, toEnd = false;
2032        private K fromKey, toKey;
2033        private Object readResolve() {
2034            return new AscendingSubMap<>(TreeMap.this,
2035                                         fromStart, fromKey, true,
2036                                         toEnd, toKey, false);
2037        }
2038        public Set<Map.Entry<K,V>> entrySet() { throw new InternalError(); }
2039        public K lastKey() { throw new InternalError(); }
2040        public K firstKey() { throw new InternalError(); }
2041        public SortedMap<K,V> subMap(K fromKey, K toKey) { throw new InternalError(); }
2042        public SortedMap<K,V> headMap(K toKey) { throw new InternalError(); }
2043        public SortedMap<K,V> tailMap(K fromKey) { throw new InternalError(); }
2044        public Comparator<? super K> comparator() { throw new InternalError(); }
2045    }
2046
2047
2048    // Red-black mechanics
2049
2050    private static final boolean RED   = false;
2051    private static final boolean BLACK = true;
2052
2053    /**
2054     * Node in the Tree.  Doubles as a means to pass key-value pairs back to
2055     * user (see Map.Entry).
2056     */
2057
2058    static final class TreeMapEntry<K,V> implements Map.Entry<K,V> {
2059        K key;
2060        V value;
2061        TreeMapEntry<K,V> left = null;
2062        TreeMapEntry<K,V> right = null;
2063        TreeMapEntry<K,V> parent;
2064        boolean color = BLACK;
2065
2066        /**
2067         * Make a new cell with given key, value, and parent, and with
2068         * {@code null} child links, and BLACK color.
2069         */
2070        TreeMapEntry(K key, V value, TreeMapEntry<K,V> parent) {
2071            this.key = key;
2072            this.value = value;
2073            this.parent = parent;
2074        }
2075
2076        /**
2077         * Returns the key.
2078         *
2079         * @return the key
2080         */
2081        public K getKey() {
2082            return key;
2083        }
2084
2085        /**
2086         * Returns the value associated with the key.
2087         *
2088         * @return the value associated with the key
2089         */
2090        public V getValue() {
2091            return value;
2092        }
2093
2094        /**
2095         * Replaces the value currently associated with the key with the given
2096         * value.
2097         *
2098         * @return the value associated with the key before this method was
2099         *         called
2100         */
2101        public V setValue(V value) {
2102            V oldValue = this.value;
2103            this.value = value;
2104            return oldValue;
2105        }
2106
2107        public boolean equals(Object o) {
2108            if (!(o instanceof Map.Entry))
2109                return false;
2110            Map.Entry<?,?> e = (Map.Entry<?,?>)o;
2111
2112            return valEquals(key,e.getKey()) && valEquals(value,e.getValue());
2113        }
2114
2115        public int hashCode() {
2116            int keyHash = (key==null ? 0 : key.hashCode());
2117            int valueHash = (value==null ? 0 : value.hashCode());
2118            return keyHash ^ valueHash;
2119        }
2120
2121        public String toString() {
2122            return key + "=" + value;
2123        }
2124    }
2125
2126    /**
2127     * Returns the first Entry in the TreeMap (according to the TreeMap's
2128     * key-sort function).  Returns null if the TreeMap is empty.
2129     */
2130    final TreeMapEntry<K,V> getFirstEntry() {
2131        TreeMapEntry<K,V> p = root;
2132        if (p != null)
2133            while (p.left != null)
2134                p = p.left;
2135        return p;
2136    }
2137
2138    /**
2139     * Returns the last Entry in the TreeMap (according to the TreeMap's
2140     * key-sort function).  Returns null if the TreeMap is empty.
2141     */
2142    final TreeMapEntry<K,V> getLastEntry() {
2143        TreeMapEntry<K,V> p = root;
2144        if (p != null)
2145            while (p.right != null)
2146                p = p.right;
2147        return p;
2148    }
2149
2150    /**
2151     * Returns the successor of the specified Entry, or null if no such.
2152     */
2153    static <K,V> TreeMapEntry<K,V> successor(TreeMapEntry<K,V> t) {
2154        if (t == null)
2155            return null;
2156        else if (t.right != null) {
2157            TreeMapEntry<K,V> p = t.right;
2158            while (p.left != null)
2159                p = p.left;
2160            return p;
2161        } else {
2162            TreeMapEntry<K,V> p = t.parent;
2163            TreeMapEntry<K,V> ch = t;
2164            while (p != null && ch == p.right) {
2165                ch = p;
2166                p = p.parent;
2167            }
2168            return p;
2169        }
2170    }
2171
2172    /**
2173     * Returns the predecessor of the specified Entry, or null if no such.
2174     */
2175    static <K,V> TreeMapEntry<K,V> predecessor(TreeMapEntry<K,V> t) {
2176        if (t == null)
2177            return null;
2178        else if (t.left != null) {
2179            TreeMapEntry<K,V> p = t.left;
2180            while (p.right != null)
2181                p = p.right;
2182            return p;
2183        } else {
2184            TreeMapEntry<K,V> p = t.parent;
2185            TreeMapEntry<K,V> ch = t;
2186            while (p != null && ch == p.left) {
2187                ch = p;
2188                p = p.parent;
2189            }
2190            return p;
2191        }
2192    }
2193
2194    /**
2195     * Balancing operations.
2196     *
2197     * Implementations of rebalancings during insertion and deletion are
2198     * slightly different than the CLR version.  Rather than using dummy
2199     * nilnodes, we use a set of accessors that deal properly with null.  They
2200     * are used to avoid messiness surrounding nullness checks in the main
2201     * algorithms.
2202     */
2203
2204    private static <K,V> boolean colorOf(TreeMapEntry<K,V> p) {
2205        return (p == null ? BLACK : p.color);
2206    }
2207
2208    private static <K,V> TreeMapEntry<K,V> parentOf(TreeMapEntry<K,V> p) {
2209        return (p == null ? null: p.parent);
2210    }
2211
2212    private static <K,V> void setColor(TreeMapEntry<K,V> p, boolean c) {
2213        if (p != null)
2214            p.color = c;
2215    }
2216
2217    private static <K,V> TreeMapEntry<K,V> leftOf(TreeMapEntry<K,V> p) {
2218        return (p == null) ? null: p.left;
2219    }
2220
2221    private static <K,V> TreeMapEntry<K,V> rightOf(TreeMapEntry<K,V> p) {
2222        return (p == null) ? null: p.right;
2223    }
2224
2225    /** From CLR */
2226    private void rotateLeft(TreeMapEntry<K,V> p) {
2227        if (p != null) {
2228            TreeMapEntry<K,V> r = p.right;
2229            p.right = r.left;
2230            if (r.left != null)
2231                r.left.parent = p;
2232            r.parent = p.parent;
2233            if (p.parent == null)
2234                root = r;
2235            else if (p.parent.left == p)
2236                p.parent.left = r;
2237            else
2238                p.parent.right = r;
2239            r.left = p;
2240            p.parent = r;
2241        }
2242    }
2243
2244    /** From CLR */
2245    private void rotateRight(TreeMapEntry<K,V> p) {
2246        if (p != null) {
2247            TreeMapEntry<K,V> l = p.left;
2248            p.left = l.right;
2249            if (l.right != null) l.right.parent = p;
2250            l.parent = p.parent;
2251            if (p.parent == null)
2252                root = l;
2253            else if (p.parent.right == p)
2254                p.parent.right = l;
2255            else p.parent.left = l;
2256            l.right = p;
2257            p.parent = l;
2258        }
2259    }
2260
2261    /** From CLR */
2262    private void fixAfterInsertion(TreeMapEntry<K,V> x) {
2263        x.color = RED;
2264
2265        while (x != null && x != root && x.parent.color == RED) {
2266            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
2267                TreeMapEntry<K,V> y = rightOf(parentOf(parentOf(x)));
2268                if (colorOf(y) == RED) {
2269                    setColor(parentOf(x), BLACK);
2270                    setColor(y, BLACK);
2271                    setColor(parentOf(parentOf(x)), RED);
2272                    x = parentOf(parentOf(x));
2273                } else {
2274                    if (x == rightOf(parentOf(x))) {
2275                        x = parentOf(x);
2276                        rotateLeft(x);
2277                    }
2278                    setColor(parentOf(x), BLACK);
2279                    setColor(parentOf(parentOf(x)), RED);
2280                    rotateRight(parentOf(parentOf(x)));
2281                }
2282            } else {
2283                TreeMapEntry<K,V> y = leftOf(parentOf(parentOf(x)));
2284                if (colorOf(y) == RED) {
2285                    setColor(parentOf(x), BLACK);
2286                    setColor(y, BLACK);
2287                    setColor(parentOf(parentOf(x)), RED);
2288                    x = parentOf(parentOf(x));
2289                } else {
2290                    if (x == leftOf(parentOf(x))) {
2291                        x = parentOf(x);
2292                        rotateRight(x);
2293                    }
2294                    setColor(parentOf(x), BLACK);
2295                    setColor(parentOf(parentOf(x)), RED);
2296                    rotateLeft(parentOf(parentOf(x)));
2297                }
2298            }
2299        }
2300        root.color = BLACK;
2301    }
2302
2303    /**
2304     * Delete node p, and then rebalance the tree.
2305     */
2306    private void deleteEntry(TreeMapEntry<K,V> p) {
2307        modCount++;
2308        size--;
2309
2310        // If strictly internal, copy successor's element to p and then make p
2311        // point to successor.
2312        if (p.left != null && p.right != null) {
2313            TreeMapEntry<K,V> s = successor(p);
2314            p.key = s.key;
2315            p.value = s.value;
2316            p = s;
2317        } // p has 2 children
2318
2319        // Start fixup at replacement node, if it exists.
2320        TreeMapEntry<K,V> replacement = (p.left != null ? p.left : p.right);
2321
2322        if (replacement != null) {
2323            // Link replacement to parent
2324            replacement.parent = p.parent;
2325            if (p.parent == null)
2326                root = replacement;
2327            else if (p == p.parent.left)
2328                p.parent.left  = replacement;
2329            else
2330                p.parent.right = replacement;
2331
2332            // Null out links so they are OK to use by fixAfterDeletion.
2333            p.left = p.right = p.parent = null;
2334
2335            // Fix replacement
2336            if (p.color == BLACK)
2337                fixAfterDeletion(replacement);
2338        } else if (p.parent == null) { // return if we are the only node.
2339            root = null;
2340        } else { //  No children. Use self as phantom replacement and unlink.
2341            if (p.color == BLACK)
2342                fixAfterDeletion(p);
2343
2344            if (p.parent != null) {
2345                if (p == p.parent.left)
2346                    p.parent.left = null;
2347                else if (p == p.parent.right)
2348                    p.parent.right = null;
2349                p.parent = null;
2350            }
2351        }
2352    }
2353
2354    /** From CLR */
2355    private void fixAfterDeletion(TreeMapEntry<K,V> x) {
2356        while (x != root && colorOf(x) == BLACK) {
2357            if (x == leftOf(parentOf(x))) {
2358                TreeMapEntry<K,V> sib = rightOf(parentOf(x));
2359
2360                if (colorOf(sib) == RED) {
2361                    setColor(sib, BLACK);
2362                    setColor(parentOf(x), RED);
2363                    rotateLeft(parentOf(x));
2364                    sib = rightOf(parentOf(x));
2365                }
2366
2367                if (colorOf(leftOf(sib))  == BLACK &&
2368                    colorOf(rightOf(sib)) == BLACK) {
2369                    setColor(sib, RED);
2370                    x = parentOf(x);
2371                } else {
2372                    if (colorOf(rightOf(sib)) == BLACK) {
2373                        setColor(leftOf(sib), BLACK);
2374                        setColor(sib, RED);
2375                        rotateRight(sib);
2376                        sib = rightOf(parentOf(x));
2377                    }
2378                    setColor(sib, colorOf(parentOf(x)));
2379                    setColor(parentOf(x), BLACK);
2380                    setColor(rightOf(sib), BLACK);
2381                    rotateLeft(parentOf(x));
2382                    x = root;
2383                }
2384            } else { // symmetric
2385                TreeMapEntry<K,V> sib = leftOf(parentOf(x));
2386
2387                if (colorOf(sib) == RED) {
2388                    setColor(sib, BLACK);
2389                    setColor(parentOf(x), RED);
2390                    rotateRight(parentOf(x));
2391                    sib = leftOf(parentOf(x));
2392                }
2393
2394                if (colorOf(rightOf(sib)) == BLACK &&
2395                    colorOf(leftOf(sib)) == BLACK) {
2396                    setColor(sib, RED);
2397                    x = parentOf(x);
2398                } else {
2399                    if (colorOf(leftOf(sib)) == BLACK) {
2400                        setColor(rightOf(sib), BLACK);
2401                        setColor(sib, RED);
2402                        rotateLeft(sib);
2403                        sib = leftOf(parentOf(x));
2404                    }
2405                    setColor(sib, colorOf(parentOf(x)));
2406                    setColor(parentOf(x), BLACK);
2407                    setColor(leftOf(sib), BLACK);
2408                    rotateRight(parentOf(x));
2409                    x = root;
2410                }
2411            }
2412        }
2413
2414        setColor(x, BLACK);
2415    }
2416
2417    private static final long serialVersionUID = 919286545866124006L;
2418
2419    /**
2420     * Save the state of the {@code TreeMap} instance to a stream (i.e.,
2421     * serialize it).
2422     *
2423     * @serialData The <em>size</em> of the TreeMap (the number of key-value
2424     *             mappings) is emitted (int), followed by the key (Object)
2425     *             and value (Object) for each key-value mapping represented
2426     *             by the TreeMap. The key-value mappings are emitted in
2427     *             key-order (as determined by the TreeMap's Comparator,
2428     *             or by the keys' natural ordering if the TreeMap has no
2429     *             Comparator).
2430     */
2431    private void writeObject(java.io.ObjectOutputStream s)
2432        throws java.io.IOException {
2433        // Write out the Comparator and any hidden stuff
2434        s.defaultWriteObject();
2435
2436        // Write out size (number of Mappings)
2437        s.writeInt(size);
2438
2439        // Write out keys and values (alternating)
2440        for (Iterator<Map.Entry<K,V>> i = entrySet().iterator(); i.hasNext(); ) {
2441            Map.Entry<K,V> e = i.next();
2442            s.writeObject(e.getKey());
2443            s.writeObject(e.getValue());
2444        }
2445    }
2446
2447    /**
2448     * Reconstitute the {@code TreeMap} instance from a stream (i.e.,
2449     * deserialize it).
2450     */
2451    private void readObject(final java.io.ObjectInputStream s)
2452        throws java.io.IOException, ClassNotFoundException {
2453        // Read in the Comparator and any hidden stuff
2454        s.defaultReadObject();
2455
2456        // Read in size
2457        int size = s.readInt();
2458
2459        buildFromSorted(size, null, s, null);
2460    }
2461
2462    /** Intended to be called only from TreeSet.readObject */
2463    void readTreeSet(int size, java.io.ObjectInputStream s, V defaultVal)
2464        throws java.io.IOException, ClassNotFoundException {
2465        buildFromSorted(size, null, s, defaultVal);
2466    }
2467
2468    /** Intended to be called only from TreeSet.addAll */
2469    void addAllForTreeSet(SortedSet<? extends K> set, V defaultVal) {
2470        try {
2471            buildFromSorted(set.size(), set.iterator(), null, defaultVal);
2472        } catch (java.io.IOException cannotHappen) {
2473        } catch (ClassNotFoundException cannotHappen) {
2474        }
2475    }
2476
2477
2478    /**
2479     * Linear time tree building algorithm from sorted data.  Can accept keys
2480     * and/or values from iterator or stream. This leads to too many
2481     * parameters, but seems better than alternatives.  The four formats
2482     * that this method accepts are:
2483     *
2484     *    1) An iterator of Map.Entries.  (it != null, defaultVal == null).
2485     *    2) An iterator of keys.         (it != null, defaultVal != null).
2486     *    3) A stream of alternating serialized keys and values.
2487     *                                   (it == null, defaultVal == null).
2488     *    4) A stream of serialized keys. (it == null, defaultVal != null).
2489     *
2490     * It is assumed that the comparator of the TreeMap is already set prior
2491     * to calling this method.
2492     *
2493     * @param size the number of keys (or key-value pairs) to be read from
2494     *        the iterator or stream
2495     * @param it If non-null, new entries are created from entries
2496     *        or keys read from this iterator.
2497     * @param str If non-null, new entries are created from keys and
2498     *        possibly values read from this stream in serialized form.
2499     *        Exactly one of it and str should be non-null.
2500     * @param defaultVal if non-null, this default value is used for
2501     *        each value in the map.  If null, each value is read from
2502     *        iterator or stream, as described above.
2503     * @throws java.io.IOException propagated from stream reads. This cannot
2504     *         occur if str is null.
2505     * @throws ClassNotFoundException propagated from readObject.
2506     *         This cannot occur if str is null.
2507     */
2508    private void buildFromSorted(int size, Iterator<?> it,
2509                                 java.io.ObjectInputStream str,
2510                                 V defaultVal)
2511        throws  java.io.IOException, ClassNotFoundException {
2512        this.size = size;
2513        root = buildFromSorted(0, 0, size-1, computeRedLevel(size),
2514                               it, str, defaultVal);
2515    }
2516
2517    /**
2518     * Recursive "helper method" that does the real work of the
2519     * previous method.  Identically named parameters have
2520     * identical definitions.  Additional parameters are documented below.
2521     * It is assumed that the comparator and size fields of the TreeMap are
2522     * already set prior to calling this method.  (It ignores both fields.)
2523     *
2524     * @param level the current level of tree. Initial call should be 0.
2525     * @param lo the first element index of this subtree. Initial should be 0.
2526     * @param hi the last element index of this subtree.  Initial should be
2527     *        size-1.
2528     * @param redLevel the level at which nodes should be red.
2529     *        Must be equal to computeRedLevel for tree of this size.
2530     */
2531    @SuppressWarnings("unchecked")
2532    private final TreeMapEntry<K,V> buildFromSorted(int level, int lo, int hi,
2533                                             int redLevel,
2534                                             Iterator<?> it,
2535                                             java.io.ObjectInputStream str,
2536                                             V defaultVal)
2537        throws  java.io.IOException, ClassNotFoundException {
2538        /*
2539         * Strategy: The root is the middlemost element. To get to it, we
2540         * have to first recursively construct the entire left subtree,
2541         * so as to grab all of its elements. We can then proceed with right
2542         * subtree.
2543         *
2544         * The lo and hi arguments are the minimum and maximum
2545         * indices to pull out of the iterator or stream for current subtree.
2546         * They are not actually indexed, we just proceed sequentially,
2547         * ensuring that items are extracted in corresponding order.
2548         */
2549
2550        if (hi < lo) return null;
2551
2552        int mid = (lo + hi) >>> 1;
2553
2554        TreeMapEntry<K,V> left  = null;
2555        if (lo < mid)
2556            left = buildFromSorted(level+1, lo, mid - 1, redLevel,
2557                                   it, str, defaultVal);
2558
2559        // extract key and/or value from iterator or stream
2560        K key;
2561        V value;
2562        if (it != null) {
2563            if (defaultVal==null) {
2564                Map.Entry<K,V> entry = (Map.Entry<K,V>)it.next();
2565                key = entry.getKey();
2566                value = entry.getValue();
2567            } else {
2568                key = (K)it.next();
2569                value = defaultVal;
2570            }
2571        } else { // use stream
2572            key = (K) str.readObject();
2573            value = (defaultVal != null ? defaultVal : (V) str.readObject());
2574        }
2575
2576        TreeMapEntry<K,V> middle =  new TreeMapEntry<>(key, value, null);
2577
2578        // color nodes in non-full bottommost level red
2579        if (level == redLevel)
2580            middle.color = RED;
2581
2582        if (left != null) {
2583            middle.left = left;
2584            left.parent = middle;
2585        }
2586
2587        if (mid < hi) {
2588            TreeMapEntry<K,V> right = buildFromSorted(level+1, mid+1, hi, redLevel,
2589                                               it, str, defaultVal);
2590            middle.right = right;
2591            right.parent = middle;
2592        }
2593
2594        return middle;
2595    }
2596
2597    /**
2598     * Find the level down to which to assign all nodes BLACK.  This is the
2599     * last `full' level of the complete binary tree produced by
2600     * buildTree. The remaining nodes are colored RED. (This makes a `nice'
2601     * set of color assignments wrt future insertions.) This level number is
2602     * computed by finding the number of splits needed to reach the zeroeth
2603     * node.  (The answer is ~lg(N), but in any case must be computed by same
2604     * quick O(lg(N)) loop.)
2605     */
2606    private static int computeRedLevel(int sz) {
2607        int level = 0;
2608        for (int m = sz - 1; m >= 0; m = m / 2 - 1)
2609            level++;
2610        return level;
2611    }
2612
2613    /**
2614     * Currently, we support Spliterator-based versions only for the
2615     * full map, in either plain of descending form, otherwise relying
2616     * on defaults because size estimation for submaps would dominate
2617     * costs. The type tests needed to check these for key views are
2618     * not very nice but avoid disrupting existing class
2619     * structures. Callers must use plain default spliterators if this
2620     * returns null.
2621     */
2622    static <K> Spliterator<K> keySpliteratorFor(NavigableMap<K,?> m) {
2623        if (m instanceof TreeMap) {
2624            @SuppressWarnings("unchecked") TreeMap<K,Object> t =
2625                (TreeMap<K,Object>) m;
2626            return t.keySpliterator();
2627        }
2628        if (m instanceof DescendingSubMap) {
2629            @SuppressWarnings("unchecked") DescendingSubMap<K,?> dm =
2630                (DescendingSubMap<K,?>) m;
2631            TreeMap<K,?> tm = dm.m;
2632            if (dm == tm.descendingMap) {
2633                @SuppressWarnings("unchecked") TreeMap<K,Object> t =
2634                    (TreeMap<K,Object>) tm;
2635                return t.descendingKeySpliterator();
2636            }
2637        }
2638        @SuppressWarnings("unchecked") NavigableSubMap<K,?> sm =
2639            (NavigableSubMap<K,?>) m;
2640        return sm.keySpliterator();
2641    }
2642
2643    final Spliterator<K> keySpliterator() {
2644        return new KeySpliterator<K,V>(this, null, null, 0, -1, 0);
2645    }
2646
2647    final Spliterator<K> descendingKeySpliterator() {
2648        return new DescendingKeySpliterator<K,V>(this, null, null, 0, -2, 0);
2649    }
2650
2651    /**
2652     * Base class for spliterators.  Iteration starts at a given
2653     * origin and continues up to but not including a given fence (or
2654     * null for end).  At top-level, for ascending cases, the first
2655     * split uses the root as left-fence/right-origin. From there,
2656     * right-hand splits replace the current fence with its left
2657     * child, also serving as origin for the split-off spliterator.
2658     * Left-hands are symmetric. Descending versions place the origin
2659     * at the end and invert ascending split rules.  This base class
2660     * is non-commital about directionality, or whether the top-level
2661     * spliterator covers the whole tree. This means that the actual
2662     * split mechanics are located in subclasses. Some of the subclass
2663     * trySplit methods are identical (except for return types), but
2664     * not nicely factorable.
2665     *
2666     * Currently, subclass versions exist only for the full map
2667     * (including descending keys via its descendingMap).  Others are
2668     * possible but currently not worthwhile because submaps require
2669     * O(n) computations to determine size, which substantially limits
2670     * potential speed-ups of using custom Spliterators versus default
2671     * mechanics.
2672     *
2673     * To boostrap initialization, external constructors use
2674     * negative size estimates: -1 for ascend, -2 for descend.
2675     */
2676    static class TreeMapSpliterator<K,V> {
2677        final TreeMap<K,V> tree;
2678        TreeMapEntry<K,V> current; // traverser; initially first node in range
2679        TreeMapEntry<K,V> fence;   // one past last, or null
2680        int side;                   // 0: top, -1: is a left split, +1: right
2681        int est;                    // size estimate (exact only for top-level)
2682        int expectedModCount;       // for CME checks
2683
2684        TreeMapSpliterator(TreeMap<K,V> tree,
2685                           TreeMapEntry<K,V> origin, TreeMapEntry<K,V> fence,
2686                           int side, int est, int expectedModCount) {
2687            this.tree = tree;
2688            this.current = origin;
2689            this.fence = fence;
2690            this.side = side;
2691            this.est = est;
2692            this.expectedModCount = expectedModCount;
2693        }
2694
2695        final int getEstimate() { // force initialization
2696            int s; TreeMap<K,V> t;
2697            if ((s = est) < 0) {
2698                if ((t = tree) != null) {
2699                    current = (s == -1) ? t.getFirstEntry() : t.getLastEntry();
2700                    s = est = t.size;
2701                    expectedModCount = t.modCount;
2702                }
2703                else
2704                    s = est = 0;
2705            }
2706            return s;
2707        }
2708
2709        public final long estimateSize() {
2710            return (long)getEstimate();
2711        }
2712    }
2713
2714    static final class KeySpliterator<K,V>
2715        extends TreeMapSpliterator<K,V>
2716        implements Spliterator<K> {
2717        KeySpliterator(TreeMap<K,V> tree,
2718                       TreeMapEntry<K,V> origin, TreeMapEntry<K,V> fence,
2719                       int side, int est, int expectedModCount) {
2720            super(tree, origin, fence, side, est, expectedModCount);
2721        }
2722
2723        public KeySpliterator<K,V> trySplit() {
2724            if (est < 0)
2725                getEstimate(); // force initialization
2726            int d = side;
2727            TreeMapEntry<K,V> e = current, f = fence,
2728                s = ((e == null || e == f) ? null :      // empty
2729                     (d == 0)              ? tree.root : // was top
2730                     (d >  0)              ? e.right :   // was right
2731                     (d <  0 && f != null) ? f.left :    // was left
2732                     null);
2733            if (s != null && s != e && s != f &&
2734                tree.compare(e.key, s.key) < 0) {        // e not already past s
2735                side = 1;
2736                return new KeySpliterator<>
2737                    (tree, e, current = s, -1, est >>>= 1, expectedModCount);
2738            }
2739            return null;
2740        }
2741
2742        public void forEachRemaining(Consumer<? super K> action) {
2743            if (action == null)
2744                throw new NullPointerException();
2745            if (est < 0)
2746                getEstimate(); // force initialization
2747            TreeMapEntry<K,V> f = fence, e, p, pl;
2748            if ((e = current) != null && e != f) {
2749                current = f; // exhaust
2750                do {
2751                    action.accept(e.key);
2752                    if ((p = e.right) != null) {
2753                        while ((pl = p.left) != null)
2754                            p = pl;
2755                    }
2756                    else {
2757                        while ((p = e.parent) != null && e == p.right)
2758                            e = p;
2759                    }
2760                } while ((e = p) != null && e != f);
2761                if (tree.modCount != expectedModCount)
2762                    throw new ConcurrentModificationException();
2763            }
2764        }
2765
2766        public boolean tryAdvance(Consumer<? super K> action) {
2767            TreeMapEntry<K,V> e;
2768            if (action == null)
2769                throw new NullPointerException();
2770            if (est < 0)
2771                getEstimate(); // force initialization
2772            if ((e = current) == null || e == fence)
2773                return false;
2774            current = successor(e);
2775            action.accept(e.key);
2776            if (tree.modCount != expectedModCount)
2777                throw new ConcurrentModificationException();
2778            return true;
2779        }
2780
2781        public int characteristics() {
2782            return (side == 0 ? Spliterator.SIZED : 0) |
2783                Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED;
2784        }
2785
2786        public final Comparator<? super K>  getComparator() {
2787            return tree.comparator;
2788        }
2789
2790    }
2791
2792    static final class DescendingKeySpliterator<K,V>
2793        extends TreeMapSpliterator<K,V>
2794        implements Spliterator<K> {
2795        DescendingKeySpliterator(TreeMap<K,V> tree,
2796                                 TreeMapEntry<K,V> origin, TreeMapEntry<K,V> fence,
2797                                 int side, int est, int expectedModCount) {
2798            super(tree, origin, fence, side, est, expectedModCount);
2799        }
2800
2801        public DescendingKeySpliterator<K,V> trySplit() {
2802            if (est < 0)
2803                getEstimate(); // force initialization
2804            int d = side;
2805            TreeMapEntry<K,V> e = current, f = fence,
2806                    s = ((e == null || e == f) ? null :      // empty
2807                         (d == 0)              ? tree.root : // was top
2808                         (d <  0)              ? e.left :    // was left
2809                         (d >  0 && f != null) ? f.right :   // was right
2810                         null);
2811            if (s != null && s != e && s != f &&
2812                tree.compare(e.key, s.key) > 0) {       // e not already past s
2813                side = 1;
2814                return new DescendingKeySpliterator<>
2815                        (tree, e, current = s, -1, est >>>= 1, expectedModCount);
2816            }
2817            return null;
2818        }
2819
2820        public void forEachRemaining(Consumer<? super K> action) {
2821            if (action == null)
2822                throw new NullPointerException();
2823            if (est < 0)
2824                getEstimate(); // force initialization
2825            TreeMapEntry<K,V> f = fence, e, p, pr;
2826            if ((e = current) != null && e != f) {
2827                current = f; // exhaust
2828                do {
2829                    action.accept(e.key);
2830                    if ((p = e.left) != null) {
2831                        while ((pr = p.right) != null)
2832                            p = pr;
2833                    }
2834                    else {
2835                        while ((p = e.parent) != null && e == p.left)
2836                            e = p;
2837                    }
2838                } while ((e = p) != null && e != f);
2839                if (tree.modCount != expectedModCount)
2840                    throw new ConcurrentModificationException();
2841            }
2842        }
2843
2844        public boolean tryAdvance(Consumer<? super K> action) {
2845            TreeMapEntry<K,V> e;
2846            if (action == null)
2847                throw new NullPointerException();
2848            if (est < 0)
2849                getEstimate(); // force initialization
2850            if ((e = current) == null || e == fence)
2851                return false;
2852            current = predecessor(e);
2853            action.accept(e.key);
2854            if (tree.modCount != expectedModCount)
2855                throw new ConcurrentModificationException();
2856            return true;
2857        }
2858
2859        public int characteristics() {
2860            return (side == 0 ? Spliterator.SIZED : 0) |
2861                Spliterator.DISTINCT | Spliterator.ORDERED;
2862        }
2863    }
2864
2865    static final class ValueSpliterator<K,V>
2866            extends TreeMapSpliterator<K,V>
2867            implements Spliterator<V> {
2868        ValueSpliterator(TreeMap<K,V> tree,
2869                         TreeMapEntry<K,V> origin, TreeMapEntry<K,V> fence,
2870                         int side, int est, int expectedModCount) {
2871            super(tree, origin, fence, side, est, expectedModCount);
2872        }
2873
2874        public ValueSpliterator<K,V> trySplit() {
2875            if (est < 0)
2876                getEstimate(); // force initialization
2877            int d = side;
2878            TreeMapEntry<K,V> e = current, f = fence,
2879                    s = ((e == null || e == f) ? null :      // empty
2880                         (d == 0)              ? tree.root : // was top
2881                         (d >  0)              ? e.right :   // was right
2882                         (d <  0 && f != null) ? f.left :    // was left
2883                         null);
2884            if (s != null && s != e && s != f &&
2885                tree.compare(e.key, s.key) < 0) {        // e not already past s
2886                side = 1;
2887                return new ValueSpliterator<>
2888                        (tree, e, current = s, -1, est >>>= 1, expectedModCount);
2889            }
2890            return null;
2891        }
2892
2893        public void forEachRemaining(Consumer<? super V> action) {
2894            if (action == null)
2895                throw new NullPointerException();
2896            if (est < 0)
2897                getEstimate(); // force initialization
2898            TreeMapEntry<K,V> f = fence, e, p, pl;
2899            if ((e = current) != null && e != f) {
2900                current = f; // exhaust
2901                do {
2902                    action.accept(e.value);
2903                    if ((p = e.right) != null) {
2904                        while ((pl = p.left) != null)
2905                            p = pl;
2906                    }
2907                    else {
2908                        while ((p = e.parent) != null && e == p.right)
2909                            e = p;
2910                    }
2911                } while ((e = p) != null && e != f);
2912                if (tree.modCount != expectedModCount)
2913                    throw new ConcurrentModificationException();
2914            }
2915        }
2916
2917        public boolean tryAdvance(Consumer<? super V> action) {
2918            TreeMapEntry<K,V> e;
2919            if (action == null)
2920                throw new NullPointerException();
2921            if (est < 0)
2922                getEstimate(); // force initialization
2923            if ((e = current) == null || e == fence)
2924                return false;
2925            current = successor(e);
2926            action.accept(e.value);
2927            if (tree.modCount != expectedModCount)
2928                throw new ConcurrentModificationException();
2929            return true;
2930        }
2931
2932        public int characteristics() {
2933            return (side == 0 ? Spliterator.SIZED : 0) | Spliterator.ORDERED;
2934        }
2935    }
2936
2937    static final class EntrySpliterator<K,V>
2938        extends TreeMapSpliterator<K,V>
2939        implements Spliterator<Map.Entry<K,V>> {
2940        EntrySpliterator(TreeMap<K,V> tree,
2941                         TreeMapEntry<K,V> origin, TreeMapEntry<K,V> fence,
2942                         int side, int est, int expectedModCount) {
2943            super(tree, origin, fence, side, est, expectedModCount);
2944        }
2945
2946        public EntrySpliterator<K,V> trySplit() {
2947            if (est < 0)
2948                getEstimate(); // force initialization
2949            int d = side;
2950            TreeMapEntry<K,V> e = current, f = fence,
2951                    s = ((e == null || e == f) ? null :      // empty
2952                         (d == 0)              ? tree.root : // was top
2953                         (d >  0)              ? e.right :   // was right
2954                         (d <  0 && f != null) ? f.left :    // was left
2955                         null);
2956            if (s != null && s != e && s != f &&
2957                tree.compare(e.key, s.key) < 0) {        // e not already past s
2958                side = 1;
2959                return new EntrySpliterator<>
2960                        (tree, e, current = s, -1, est >>>= 1, expectedModCount);
2961            }
2962            return null;
2963        }
2964
2965        public void forEachRemaining(Consumer<? super Map.Entry<K, V>> action) {
2966            if (action == null)
2967                throw new NullPointerException();
2968            if (est < 0)
2969                getEstimate(); // force initialization
2970            TreeMapEntry<K,V> f = fence, e, p, pl;
2971            if ((e = current) != null && e != f) {
2972                current = f; // exhaust
2973                do {
2974                    action.accept(e);
2975                    if ((p = e.right) != null) {
2976                        while ((pl = p.left) != null)
2977                            p = pl;
2978                    }
2979                    else {
2980                        while ((p = e.parent) != null && e == p.right)
2981                            e = p;
2982                    }
2983                } while ((e = p) != null && e != f);
2984                if (tree.modCount != expectedModCount)
2985                    throw new ConcurrentModificationException();
2986            }
2987        }
2988
2989        public boolean tryAdvance(Consumer<? super Map.Entry<K,V>> action) {
2990            TreeMapEntry<K,V> e;
2991            if (action == null)
2992                throw new NullPointerException();
2993            if (est < 0)
2994                getEstimate(); // force initialization
2995            if ((e = current) == null || e == fence)
2996                return false;
2997            current = successor(e);
2998            action.accept(e);
2999            if (tree.modCount != expectedModCount)
3000                throw new ConcurrentModificationException();
3001            return true;
3002        }
3003
3004        public int characteristics() {
3005            return (side == 0 ? Spliterator.SIZED : 0) |
3006                    Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED;
3007        }
3008
3009        @Override
3010        public Comparator<Map.Entry<K, V>> getComparator() {
3011            // Adapt or create a key-based comparator
3012            if (tree.comparator != null) {
3013                return Map.Entry.comparingByKey(tree.comparator);
3014            }
3015            else {
3016                return (Comparator<Map.Entry<K, V>> & Serializable) (e1, e2) -> {
3017                    @SuppressWarnings("unchecked")
3018                    Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey();
3019                    return k1.compareTo(e2.getKey());
3020                };
3021            }
3022        }
3023    }
3024}
3025