1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is an abstract implementation of the {@code Map} interface. This
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implementation does not support adding. A subclass must implement the
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * abstract method entrySet().
243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson *
253819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @since 1.2
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class AbstractMap<K, V> implements Map<K, V> {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Lazily initialized key set.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Set<K> keySet;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Collection<V> valuesCollection;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new instance of this {@code AbstractMap}.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected AbstractMap() {
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super();
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Removes all elements from this map, leaving it empty.
433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if removing from this map is not supported.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isEmpty()
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #size()
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void clear() {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        entrySet().clear();
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map contains the specified key.
553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key to search for.
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map contains the specified key,
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean containsKey(Object key) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(it.next().getKey())) {
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (it.next().getKey() == null) {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map contains the specified value.
813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the value to search for.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map contains the specified value,
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean containsValue(Object value) {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value != null) {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (value.equals(it.next().getValue())) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (it.next().getValue() == null) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a set containing all of the mappings in this map. Each mapping is
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an instance of {@link Map.Entry}. As the set is backed by this map,
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * changes in one will be reflected in the other.
1093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a set of the mappings.
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract Set<Map.Entry<K, V>> entrySet();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares the specified object to this instance, and returns {@code true}
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if the specified object is a map and both maps contain the same mappings.
1173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare with this object.
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return boolean {@code true} if the object is the same as this object,
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         and {@code false} if it is different from this object.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #hashCode()
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #entrySet()
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object object) {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this == object) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (object instanceof Map) {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map<?, ?> map = (Map<?, ?>) object;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (size() != map.size()) {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            try {
13772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                for (Entry<K, V> entry : entrySet()) {
1383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    K key = entry.getKey();
13972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    V mine = entry.getValue();
14072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    Object theirs = map.get(key);
14172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    if (mine == null) {
14272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                        if (theirs != null || !map.containsKey(key)) {
14372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            return false;
14472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                        }
14572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    } else if (!mine.equals(theirs)) {
1463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        return false;
1473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
14972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            } catch (NullPointerException ignored) {
15072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                return false;
15172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            } catch (ClassCastException ignored) {
1523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                return false;
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the value of the mapping with the specified key.
1613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key.
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the mapping with the specified key, or {@code null}
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         if no mapping for the specified key is found.
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V get(Object key) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(entry.getKey())) {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (entry.getKey() == null) {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the hash code for this object. Objects which are equal must
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the same value for this method.
1903819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hash code of this object.
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #equals(Object)
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = 0;
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result += it.next().hashCode();
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map is empty.
2063819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map has no elements, {@code false}
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         otherwise.
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #size()
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isEmpty() {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return size() == 0;
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a set of the keys contained in this map. The set is backed by
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this map so changes to one are reflected by the other. The returned set
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * does not support adding.
2193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a set of the keys.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Set<K> keySet() {
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (keySet == null) {
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keySet = new AbstractSet<K>() {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean contains(Object object) {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return containsKey(object);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return AbstractMap.this.size();
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator<K> iterator() {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator<K>() {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Iterator<Map.Entry<K, V>> setIterator = entrySet()
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                .iterator();
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.hasNext();
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public K next() {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.next().getKey();
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            setIterator.remove();
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return keySet;
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Maps the specified key to the specified value.
2613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key.
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the value.
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of any previous mapping with the specified key or
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code null} if there was no mapping.
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if adding to this map is not supported.
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the class of the key or value is inappropriate for this
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                map.
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the key or value cannot be added to this map.
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the key or value is {@code null} and this Map does not
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                support {@code null} keys or values.
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V put(K key, V value) {
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copies every mapping in the specified map to this map.
2853819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the map to copy mappings from.
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if adding to this map is not supported.
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the class of a key or value is inappropriate for this
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                map.
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if a key or value cannot be added to this map.
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if a key or value is {@code null} and this map does not
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                support {@code null} keys or values.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void putAll(Map<? extends K, ? extends V> map) {
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(entry.getKey(), entry.getValue());
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Removes a mapping with the specified key from this Map.
3073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key of the mapping to remove.
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the removed mapping or {@code null} if no mapping
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         for the specified key was found.
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if removing from this map is not supported.
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V remove(Object key) {
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(entry.getKey())) {
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    it.remove();
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (entry.getKey() == null) {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    it.remove();
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of elements in this map.
3393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of elements in this map.
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int size() {
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return entrySet().size();
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the string representation of this map.
3483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the string representation of this map.
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isEmpty()) {
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "{}"; //$NON-NLS-1$
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder buffer = new StringBuilder(size() * 28);
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append('{');
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map.Entry<K, V> entry = it.next();
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object key = entry.getKey();
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (key != this) {
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(key);
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append("(this Map)"); //$NON-NLS-1$
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append('=');
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object value = entry.getValue();
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (value != this) {
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(value);
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append("(this Map)"); //$NON-NLS-1$
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (it.hasNext()) {
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(", "); //$NON-NLS-1$
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append('}');
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buffer.toString();
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a collection of the values contained in this map. The collection
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is backed by this map so changes to one are reflected by the other. The
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * collection supports remove, removeAll, retainAll and clear operations,
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and it does not support add or addAll operations.
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method returns a collection which is the subclass of
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * AbstractCollection. The iterator method of this subclass returns a
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "wrapper object" over the iterator of map's entrySet(). The {@code size}
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method wraps the map's size method and the {@code contains} method wraps
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the map's containsValue method.
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The collection is created when this method is called for the first time
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and returned in response to all subsequent calls. This method may return
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * different collections when multiple concurrent calls occur to this
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method, since no synchronization is performed.
3993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a collection of the values contained in this map.
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Collection<V> values() {
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (valuesCollection == null) {
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            valuesCollection = new AbstractCollection<V>() {
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return AbstractMap.this.size();
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean contains(Object object) {
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return containsValue(object);
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator<V> iterator() {
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator<V>() {
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Iterator<Map.Entry<K, V>> setIterator = entrySet()
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                .iterator();
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.hasNext();
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public V next() {
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.next().getValue();
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            setIterator.remove();
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return valuesCollection;
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a new instance of the same class as this instance, whose slots
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * have been filled in with the values of the slots of this instance.
4423819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a shallow copy of this object.
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws CloneNotSupportedException
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the receiver's class does not implement the interface
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                {@code Cloneable}.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Object clone() throws CloneNotSupportedException {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap<K, V> result = (AbstractMap<K, V>) super.clone();
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.keySet = null;
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.valuesCollection = null;
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
457