1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
206232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilsonimport java.io.Serializable;
216232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * A base class for {@code Map} implementations.
24984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson *
25984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * <p>Subclasses that permit new mappings to be added must override {@link
26984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * #put}.
27984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson *
28984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * <p>The default implementations of many methods are inefficient for large
29984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * maps. For example in the default implementation, each call to {@link #get}
30984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * performs a linear iteration of the entry set. Subclasses should override such
31984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson * methods to improve their performance.
32f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
33f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class AbstractMap<K, V> implements Map<K, V> {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Lazily initialized key set.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Set<K> keySet;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Collection<V> valuesCollection;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
43984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * An immutable key-value mapping. Despite the name, this class is non-final
44984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * and its subclasses may be mutable.
456232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     *
466232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @since 1.6
476232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
48984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    public static class SimpleImmutableEntry<K, V>
49984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            implements Map.Entry<K, V>, Serializable {
506232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        private static final long serialVersionUID = 7138329143949025153L;
516232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
52984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        private final K key;
53984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        private final V value;
546232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
556232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public SimpleImmutableEntry(K theKey, V theValue) {
566232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            key = theKey;
576232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            value = theValue;
586232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
596232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
606232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        /**
61984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson         * Constructs an instance with the key and value of {@code copyFrom}.
626232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson         */
63984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        public SimpleImmutableEntry(Map.Entry<? extends K, ? extends V> copyFrom) {
64984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            key = copyFrom.getKey();
65984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            value = copyFrom.getValue();
666232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
676232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
686232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public K getKey() {
696232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return key;
706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
716232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
726232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public V getValue() {
736232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return value;
746232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
756232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
766232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        /**
77984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson         * This base implementation throws {@code UnsupportedOperationException}
78984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson         * always.
796232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson         */
806232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public V setValue(V object) {
816232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            throw new UnsupportedOperationException();
826232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
836232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
84984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public boolean equals(Object object) {
856232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            if (this == object) {
866232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                return true;
876232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            }
886232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            if (object instanceof Map.Entry) {
896232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object;
906232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                return (key == null ? entry.getKey() == null : key.equals(entry
916232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                        .getKey()))
926232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                        && (value == null ? entry.getValue() == null : value
936232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                                .equals(entry.getValue()));
946232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            }
956232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return false;
966232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
976232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
98984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public int hashCode() {
996232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return (key == null ? 0 : key.hashCode())
1006232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                    ^ (value == null ? 0 : value.hashCode());
1016232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1026232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
103984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public String toString() {
104984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            return key + "=" + value;
1056232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1066232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    }
1076232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1086232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
109984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * A key-value mapping with mutable values.
1106232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     *
1116232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @since 1.6
1126232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
113984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    public static class SimpleEntry<K, V>
114984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            implements Map.Entry<K, V>, Serializable {
1156232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        private static final long serialVersionUID = -8499721149061103585L;
1166232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
117984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        private final K key;
1186232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        private V value;
1196232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1206232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public SimpleEntry(K theKey, V theValue) {
1216232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            key = theKey;
1226232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            value = theValue;
1236232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1246232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1256232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        /**
126984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson         * Constructs an instance with the key and value of {@code copyFrom}.
1276232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson         */
128984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        public SimpleEntry(Map.Entry<? extends K, ? extends V> copyFrom) {
129984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            key = copyFrom.getKey();
130984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            value = copyFrom.getValue();
1316232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1326232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1336232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public K getKey() {
1346232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return key;
1356232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1366232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1376232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public V getValue() {
1386232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return value;
1396232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1406232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1416232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        public V setValue(V object) {
1426232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            V result = value;
1436232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            value = object;
1446232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return result;
1456232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1466232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
147984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public boolean equals(Object object) {
1486232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            if (this == object) {
1496232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                return true;
1506232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            }
1516232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            if (object instanceof Map.Entry) {
1526232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object;
1536232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                return (key == null ? entry.getKey() == null : key.equals(entry
1546232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                        .getKey()))
1556232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                        && (value == null ? entry.getValue() == null : value
1566232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                                .equals(entry.getValue()));
1576232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            }
1586232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return false;
1596232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1606232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
161984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public int hashCode() {
1626232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            return (key == null ? 0 : key.hashCode())
1636232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                    ^ (value == null ? 0 : value.hashCode());
1646232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1656232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
166984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson        @Override public String toString() {
167984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            return key + "=" + value;
1686232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
1696232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    }
1706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected AbstractMap() {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
176f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
177984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation calls {@code entrySet().clear()}.
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        entrySet().clear();
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
184984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
185f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
186984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates its key set, looking for a key that
187984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@code key} equals.
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsKey(Object key) {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (key != null) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (key.equals(it.next().getKey())) {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (it.next().getKey() == null) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
208984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
209f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
210984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates its entry set, looking for an entry with
211984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * a value that {@code value} equals.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsValue(Object value) {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value != null) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (value.equals(it.next().getValue())) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (it.next().getValue() == null) {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Set<Map.Entry<K, V>> entrySet();
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
234984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
235f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
236984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation first checks the structure of {@code object}. If
237984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * it is not a map or of a different size, this returns false. Otherwise it
238984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * iterates its own entry set, looking up each entry's key in {@code
239984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * object}. If any value does not equal the other map's value for the same
240984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * key, this returns false. Otherwise it returns true.
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
242984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    @Override public boolean equals(Object object) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object instanceof Map) {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Map<?, ?> map = (Map<?, ?>) object;
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (size() != map.size()) {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
252f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            try {
25355392539fea537abfb6581b474918f9d611fba27Jesse Wilson                for (Entry<K, V> entry : entrySet()) {
254f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    K key = entry.getKey();
25555392539fea537abfb6581b474918f9d611fba27Jesse Wilson                    V mine = entry.getValue();
25655392539fea537abfb6581b474918f9d611fba27Jesse Wilson                    Object theirs = map.get(key);
25755392539fea537abfb6581b474918f9d611fba27Jesse Wilson                    if (mine == null) {
25855392539fea537abfb6581b474918f9d611fba27Jesse Wilson                        if (theirs != null || !map.containsKey(key)) {
25955392539fea537abfb6581b474918f9d611fba27Jesse Wilson                            return false;
26055392539fea537abfb6581b474918f9d611fba27Jesse Wilson                        }
26155392539fea537abfb6581b474918f9d611fba27Jesse Wilson                    } else if (!mine.equals(theirs)) {
262f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        return false;
263f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
26555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            } catch (NullPointerException ignored) {
26655392539fea537abfb6581b474918f9d611fba27Jesse Wilson                return false;
26755392539fea537abfb6581b474918f9d611fba27Jesse Wilson            } catch (ClassCastException ignored) {
268f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                return false;
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
276984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
277f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
278984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates its entry set, looking for an entry with
279984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * a key that {@code key} equals.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public V get(Object key) {
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (key != null) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Map.Entry<K, V> entry = it.next();
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (key.equals(entry.getKey())) {
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return entry.getValue();
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Map.Entry<K, V> entry = it.next();
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (entry.getKey() == null) {
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return entry.getValue();
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
302984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
303f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
304984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates its entry set, summing the hashcodes of
305984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * its entries.
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
307984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    @Override public int hashCode() {
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int result = 0;
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (it.hasNext()) {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result += it.next().hashCode();
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
317984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
318f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
319984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation compares {@code size()} to 0.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEmpty() {
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return size() == 0;
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
326984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
327f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
328984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation returns a view that calls through this to map. Its
329984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * iterator transforms this map's entry set iterator to return keys.
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<K> keySet() {
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (keySet == null) {
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            keySet = new AbstractSet<K>() {
334984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public boolean contains(Object object) {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return containsKey(object);
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
338984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public int size() {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return AbstractMap.this.size();
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public Iterator<K> iterator() {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return new Iterator<K>() {
344984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                        Iterator<Map.Entry<K, V>> setIterator = entrySet().iterator();
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public boolean hasNext() {
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return setIterator.hasNext();
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public K next() {
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return setIterator.next().getKey();
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public void remove() {
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            setIterator.remove();
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    };
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            };
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return keySet;
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
365984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
366f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
367984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This base implementation throws {@code UnsupportedOperationException}.
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public V put(K key, V value) {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
374984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
376984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates through {@code map}'s entry set, calling
377984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@code put()} for each.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void putAll(Map<? extends K, ? extends V> map) {
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            put(entry.getKey(), entry.getValue());
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
386984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
388984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation iterates its entry set, removing the entry with
389984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * a key that {@code key} equals.
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public V remove(Object key) {
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (key != null) {
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Map.Entry<K, V> entry = it.next();
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (key.equals(entry.getKey())) {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    it.remove();
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return entry.getValue();
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Map.Entry<K, V> entry = it.next();
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (entry.getKey() == null) {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    it.remove();
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return entry.getValue();
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
414984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
415f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
416984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation returns its entry set's size.
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return entrySet().size();
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
423984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
424f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
425984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation composes a string by iterating its entry set. If
426984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * this map contains itself as a key or a value, the string "(this Map)"
427984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * will appear in its place.
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    @Override public String toString() {
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isEmpty()) {
431984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson            return "{}";
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder buffer = new StringBuilder(size() * 28);
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer.append('{');
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (it.hasNext()) {
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Map.Entry<K, V> entry = it.next();
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object key = entry.getKey();
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (key != this) {
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buffer.append(key);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
443984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                buffer.append("(this Map)");
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            buffer.append('=');
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object value = entry.getValue();
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (value != this) {
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buffer.append(value);
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
450984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                buffer.append("(this Map)");
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (it.hasNext()) {
453984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                buffer.append(", ");
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer.append('}');
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer.toString();
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
461984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * {@inheritDoc}
462f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
463984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * <p>This implementation returns a view that calls through this to map. Its
464984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson     * iterator transforms this map's entry set iterator to return values.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<V> values() {
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (valuesCollection == null) {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            valuesCollection = new AbstractCollection<V>() {
469984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public int size() {
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return AbstractMap.this.size();
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
473984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public boolean contains(Object object) {
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return containsValue(object);
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                @Override public Iterator<V> iterator() {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return new Iterator<V>() {
479984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson                        Iterator<Map.Entry<K, V>> setIterator = entrySet().iterator();
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public boolean hasNext() {
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return setIterator.hasNext();
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public V next() {
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return setIterator.next().getValue();
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public void remove() {
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            setIterator.remove();
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    };
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            };
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valuesCollection;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
500984dc62f58d1f9611ebccc2598f714c15242a6ebJesse Wilson    @Override protected Object clone() throws CloneNotSupportedException {
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AbstractMap<K, V> result = (AbstractMap<K, V>) super.clone();
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.keySet = null;
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.valuesCollection = null;
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
50632c2297a959b72abdb18743f0519e1d8b7c7ea88Elliott Hughes}
507