AbstractMap.java revision f6c387128427e121477c1b32ad35cdcaa5101ba3
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// BEGIN android-added
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// copied from newer harmony
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Map.Entry;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// END android-added
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is an abstract implementation of the {@code Map} interface. This
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implementation does not support adding. A subclass must implement the
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * abstract method entrySet().
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class AbstractMap<K, V> implements Map<K, V> {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Lazily initialized key set.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Set<K> keySet;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Collection<V> valuesCollection;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new instance of this {@code AbstractMap}.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected AbstractMap() {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super();
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Removes all elements from this map, leaving it empty.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if removing from this map is not supported.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isEmpty()
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #size()
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void clear() {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        entrySet().clear();
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map contains the specified key.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key to search for.
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map contains the specified key,
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean containsKey(Object key) {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(it.next().getKey())) {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (it.next().getKey() == null) {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map contains the specified value.
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the value to search for.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map contains the specified value,
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean containsValue(Object value) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value != null) {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (value.equals(it.next().getValue())) {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (it.next().getValue() == null) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return true;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a set containing all of the mappings in this map. Each mapping is
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an instance of {@link Map.Entry}. As the set is backed by this map,
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * changes in one will be reflected in the other.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a set of the mappings.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract Set<Map.Entry<K, V>> entrySet();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares the specified object to this instance, and returns {@code true}
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if the specified object is a map and both maps contain the same mappings.
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare with this object.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return boolean {@code true} if the object is the same as this object,
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         and {@code false} if it is different from this object.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #hashCode()
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #entrySet()
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object object) {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this == object) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (object instanceof Map) {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map<?, ?> map = (Map<?, ?>) object;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (size() != map.size()) {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // BEGIN android-changed
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // copied from newer version of harmony
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Iterator<Map.Entry<K, V>> it = entrySet().iterator();
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Entry<K, V> entry = it.next();
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                K key = entry.getKey();
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                V value = entry.getValue();
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object obj = map.get(key);
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if( null != obj && (!obj.equals(value)) || null == obj && obj != value) {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return false;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // END android-changed
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the value of the mapping with the specified key.
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the mapping with the specified key, or {@code null}
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         if no mapping for the specified key is found.
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V get(Object key) {
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(entry.getKey())) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (entry.getKey() == null) {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the hash code for this object. Objects which are equal must
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the same value for this method.
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hash code of this object.
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #equals(Object)
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = 0;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result += it.next().hashCode();
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether this map is empty.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this map has no elements, {@code false}
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         otherwise.
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #size()
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isEmpty() {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return size() == 0;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a set of the keys contained in this map. The set is backed by
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this map so changes to one are reflected by the other. The returned set
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * does not support adding.
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a set of the keys.
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Set<K> keySet() {
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (keySet == null) {
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keySet = new AbstractSet<K>() {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean contains(Object object) {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return containsKey(object);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return AbstractMap.this.size();
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator<K> iterator() {
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator<K>() {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Iterator<Map.Entry<K, V>> setIterator = entrySet()
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                .iterator();
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.hasNext();
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public K next() {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.next().getKey();
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            setIterator.remove();
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return keySet;
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Maps the specified key to the specified value.
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key.
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the value.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of any previous mapping with the specified key or
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code null} if there was no mapping.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if adding to this map is not supported.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the class of the key or value is inappropriate for this
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                map.
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the key or value cannot be added to this map.
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the key or value is {@code null} and this Map does not
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                support {@code null} keys or values.
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V put(K key, V value) {
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copies every mapping in the specified map to this map.
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the map to copy mappings from.
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if adding to this map is not supported.
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the class of a key or value is inappropriate for this
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                map.
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if a key or value cannot be added to this map.
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if a key or value is {@code null} and this map does not
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                support {@code null} keys or values.
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void putAll(Map<? extends K, ? extends V> map) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(entry.getKey(), entry.getValue());
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Removes a mapping with the specified key from this Map.
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key of the mapping to remove.
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the removed mapping or {@code null} if no mapping
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         for the specified key was found.
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if removing from this map is not supported.
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public V remove(Object key) {
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null) {
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (key.equals(entry.getKey())) {
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    it.remove();
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> entry = it.next();
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (entry.getKey() == null) {
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    it.remove();
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return entry.getValue();
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of elements in this map.
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of elements in this map.
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int size() {
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return entrySet().size();
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the string representation of this map.
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the string representation of this map.
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isEmpty()) {
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "{}"; //$NON-NLS-1$
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder buffer = new StringBuilder(size() * 28);
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append('{');
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<Map.Entry<K, V>> it = entrySet().iterator();
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map.Entry<K, V> entry = it.next();
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object key = entry.getKey();
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (key != this) {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(key);
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append("(this Map)"); //$NON-NLS-1$
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append('=');
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object value = entry.getValue();
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (value != this) {
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(value);
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append("(this Map)"); //$NON-NLS-1$
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (it.hasNext()) {
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(", "); //$NON-NLS-1$
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append('}');
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buffer.toString();
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a collection of the values contained in this map. The collection
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is backed by this map so changes to one are reflected by the other. The
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * collection supports remove, removeAll, retainAll and clear operations,
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and it does not support add or addAll operations.
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method returns a collection which is the subclass of
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * AbstractCollection. The iterator method of this subclass returns a
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "wrapper object" over the iterator of map's entrySet(). The {@code size}
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method wraps the map's size method and the {@code contains} method wraps
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the map's containsValue method.
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </p>
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The collection is created when this method is called for the first time
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and returned in response to all subsequent calls. This method may return
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * different collections when multiple concurrent calls occur to this
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method, since no synchronization is performed.
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </p>
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a collection of the values contained in this map.
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Collection<V> values() {
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (valuesCollection == null) {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            valuesCollection = new AbstractCollection<V>() {
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return AbstractMap.this.size();
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean contains(Object object) {
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return containsValue(object);
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator<V> iterator() {
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator<V>() {
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Iterator<Map.Entry<K, V>> setIterator = entrySet()
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                .iterator();
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.hasNext();
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public V next() {
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return setIterator.next().getValue();
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            setIterator.remove();
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return valuesCollection;
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a new instance of the same class as this instance, whose slots
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * have been filled in with the values of the slots of this instance.
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a shallow copy of this object.
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws CloneNotSupportedException
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the receiver's class does not implement the interface
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                {@code Cloneable}.
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Object clone() throws CloneNotSupportedException {
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AbstractMap<K, V> result = (AbstractMap<K, V>) super.clone();
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.keySet = null;
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.valuesCollection = null;
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
477