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