Hashtable.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.internal.nls.Messages; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Hashtable associates keys with values. Both keys and values cannot be null. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The size of the Hashtable is the number of key/value pairs it contains. The 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity is the number of key/value pairs the Hashtable can hold. The load 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * factor is a float value which determines how full the Hashtable gets before 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * expanding the capacity. If the load factor of the Hashtable is exceeded, the 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity is doubled. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Enumeration 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.io.Serializable 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Object#equals 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Object#hashCode 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Cloneable, Serializable { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1421746759512286392L; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project transient int elementCount; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project transient Entry<K, V>[] elementData; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private float loadFactor; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int threshold; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project transient int firstSlot; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project transient int lastSlot = -1; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project transient int modCount; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final Enumeration<?> EMPTY_ENUMERATION = new Enumeration<Object>() { 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasMoreElements() { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object nextElement() { 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static <K, V> Entry<K, V> newEntry(K key, V value, int hash) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Entry<K, V>(key, value); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class Entry<K, V> extends MapEntry<K, V> { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> next; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final int hashcode; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry(K theKey, V theValue) { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(theKey, theValue); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hashcode = theKey.hashCode(); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object clone() { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = (Entry<K, V>) super.clone(); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (next != null) { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.next = (Entry<K, V>) next.clone(); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public V setValue(V object) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object == null) { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project V result = value; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project value = object; 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getKeyHash() { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return key.hashCode(); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equalsKey(Object aKey, int hash) { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The VM can inline String.equals 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hashcode == aKey.hashCode() 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (key instanceof String 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ? ((String) key).equals(aKey) : key.equals(aKey)); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return key + "=" + value; //$NON-NLS-1$ 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final class HashIterator<E> implements Iterator<E> { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int position, expectedModCount; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final MapEntry.Type<E, K, V> type; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Entry<K, V> lastEntry; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lastPosition; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean canRemove = false; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HashIterator(MapEntry.Type<E, K, V> value) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project type = value; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = lastSlot; 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project expectedModCount = modCount; 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNext() { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastEntry != null && lastEntry.next != null) { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (position >= firstSlot) { 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementData[position] == null) { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position--; 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E next() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (expectedModCount == modCount) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastEntry != null) { 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastEntry = lastEntry.next; 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastEntry == null) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (position >= firstSlot 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (lastEntry = elementData[position]) == null) { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position--; 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastEntry != null) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastPosition = position; 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // decrement the position so we don't find the same slot 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // next time 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position--; 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastEntry != null) { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project canRemove = true; 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return type.get(lastEntry); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ConcurrentModificationException(); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void remove() { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (expectedModCount == modCount) { 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (canRemove) { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project canRemove = false; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean removed = false; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[lastPosition]; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry == lastEntry) { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData[lastPosition] = entry.next; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project removed = true; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null && entry.next != lastEntry) { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry != null) { 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.next = lastEntry.next; 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project removed = true; 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (removed) { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modCount++; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount--; 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project expectedModCount++; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the entry must have been (re)moved outside of the 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // iterator 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // but this condition wasn't caught by the modCount 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // throw ConcurrentModificationException() outside of 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // synchronized block 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException(); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ConcurrentModificationException(); 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final class HashEnumerator<E> implements Enumeration<E> { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean key; 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int start; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry; 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project HashEnumerator(boolean isKey) { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project key = isKey; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project start = lastSlot + 1; 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasMoreElements() { 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry != null) { 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (--start >= firstSlot) { 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementData[start] != null) { 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = elementData[start]; 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E nextElement() { 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (hasMoreElements()) { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result = key ? entry.key : entry.value; 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (E) result; 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Hashtable} using the default capacity and load 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * factor. 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Hashtable() { 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(11); 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Hashtable} using the specified capacity and the 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default load factor. 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param capacity 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial capacity. 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Hashtable(int capacity) { 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (capacity >= 0) { 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount = 0; 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData = newElementArray(capacity == 0 ? 1 : capacity); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project firstSlot = elementData.length; 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project loadFactor = 0.75f; 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project computeMaxSize(); 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Hashtable} using the specified capacity and load 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * factor. 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param capacity 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial capacity. 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param loadFactor 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial load factor. 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Hashtable(int capacity, float loadFactor) { 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (capacity >= 0 && loadFactor > 0) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount = 0; 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project firstSlot = capacity; 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData = newElementArray(capacity == 0 ? 1 : capacity); 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.loadFactor = loadFactor; 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project computeMaxSize(); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code Hashtable} containing the mappings 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from the specified map. 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mappings to add. 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Hashtable(Map<? extends K, ? extends V> map) { 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(map.size() < 6 ? 11 : (map.size() * 4 / 3) + 11); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project putAll(map); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Entry<K, V>[] newElementArray(int size) { 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Entry[size]; 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes all key/value pairs from this {@code Hashtable}, leaving the 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size zero and the capacity unchanged. 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #isEmpty 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #size 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void clear() { 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount = 0; 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.fill(elementData, null); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modCount++; 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new {@code Hashtable} with the same key/value pairs, capacity 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and load factor. 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a shallow copy of this {@code Hashtable}. 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Cloneable 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized Object clone() { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable<K, V> hashtable = (Hashtable<K, V>) super.clone(); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hashtable.elementData = elementData.clone(); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry; 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = elementData.length; --i >= 0;) { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((entry = elementData[i]) != null) { 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hashtable.elementData[i] = (Entry<K, V>) entry.clone(); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hashtable; 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CloneNotSupportedException e) { 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void computeMaxSize() { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threshold = (int) (elementData.length * loadFactor); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns true if this {@code Hashtable} contains the specified object as 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value of at least one of the key/value pairs. 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to look for as a value in this {@code Hashtable}. 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if object is a value in this {@code Hashtable}, 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #containsKey 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Object#equals 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized boolean contains(Object value) { 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value == null) { 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = elementData.length; --i >= 0;) { 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[i]; 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value.equals(entry.value)) { 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns true if this {@code Hashtable} contains the specified object as a 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * key of one of the key/value pairs. 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to look for as a key in this {@code Hashtable}. 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if object is a key in this {@code Hashtable}, 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #contains 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Object#equals 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized boolean containsKey(Object key) { 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getEntry(key) != null; 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Searches this {@code Hashtable} for the specified value. 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to search for. 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if {@code value} is a value of this 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable}, {@code false} otherwise. 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean containsValue(Object value) { 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return contains(value); 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an enumeration on the values of this {@code Hashtable}. The 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * results of the Enumeration may be affected if the contents of this 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable} are modified. 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an enumeration of the values of this {@code Hashtable}. 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #keys 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #size 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Enumeration 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized Enumeration<V> elements() { 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementCount == 0) { 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (Enumeration<V>) EMPTY_ENUMERATION; 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new HashEnumerator<V>(false); 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a set of the mappings contained in this {@code Hashtable}. Each 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element in the set is a {@link Map.Entry}. The set is backed by this 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable} so changes to one are reflected by the other. The set 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not support adding. 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a set of the mappings. 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Set<Map.Entry<K, V>> entrySet() { 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Collections.SynchronizedSet<Map.Entry<K, V>>( 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new AbstractSet<Map.Entry<K, V>>() { 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elementCount; 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable.this.clear(); 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean remove(Object object) { 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contains(object)) { 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable.this 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .remove(((Map.Entry<K, V>) object) 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getKey()); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean contains(Object object) { 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = getEntry(((Map.Entry<K, V>) object) 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getKey()); 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return object.equals(entry); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<Map.Entry<K, V>> iterator() { 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new HashIterator<Map.Entry<K, V>>( 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new MapEntry.Type<Map.Entry<K, V>, K, V>() { 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Map.Entry<K, V> get( 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MapEntry<K, V> entry) { 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry; 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }); 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }, this); 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares this {@code Hashtable} with the specified object and indicates 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if they are equal. In order to be equal, {@code object} must be an 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance of Map and contain the same key/value pairs. 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare with this object. 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this Map, 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #hashCode 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized boolean equals(Object object) { 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this == object) { 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object instanceof Map) { 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map<?, ?> map = (Map<?, ?>) object; 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size() != map.size()) { 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Map.Entry<K, V>> entries = entrySet(); 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Map.Entry<?, ?> e : map.entrySet()) { 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!entries.contains(e)) { 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the value associated with the specified key in this 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable}. 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key of the value returned. 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value associated with the specified key, or {@code null} if 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified key does not exist. 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #put 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized V get(Object key) { 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = key.hashCode(); 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (hash & 0x7FFFFFFF) % elementData.length; 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[index]; 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry.equalsKey(key, hash)) { 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry.value; 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> getEntry(Object key) { 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = key.hashCode(); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (hash & 0x7FFFFFFF) % elementData.length; 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[index]; 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry.equalsKey(key, hash)) { 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry; 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized int hashCode() { 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result = 0; 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<Map.Entry<K, V>> it = entrySet().iterator(); 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<K, V> entry = it.next(); 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object key = entry.getKey(); 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object value = entry.getValue(); 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = (key != this ? key.hashCode() : 0) 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ^ (value != this ? (value != null ? value.hashCode() : 0) 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : 0); 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result += hash; 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns true if this {@code Hashtable} has no key/value pairs. 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this {@code Hashtable} has no key/value pairs, 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #size 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized boolean isEmpty() { 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elementCount == 0; 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an enumeration on the keys of this {@code Hashtable} instance. 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The results of the enumeration may be affected if the contents of this 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable} are modified. 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an enumeration of the keys of this {@code Hashtable}. 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #elements 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #size 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Enumeration 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized Enumeration<K> keys() { 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementCount == 0) { 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (Enumeration<K>) EMPTY_ENUMERATION; 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new HashEnumerator<K>(true); 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a set of the keys contained in this {@code Hashtable}. The set 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is backed by this {@code Hashtable} so changes to one are reflected by 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the other. The set does not support adding. 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a set of the keys. 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Set<K> keySet() { 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Collections.SynchronizedSet<K>(new AbstractSet<K>() { 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean contains(Object object) { 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return containsKey(object); 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elementCount; 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable.this.clear(); 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean remove(Object key) { 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (containsKey(key)) { 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable.this.remove(key); 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<K> iterator() { 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new HashIterator<K>(new MapEntry.Type<K, K, V>() { 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public K get(MapEntry<K, V> entry) { 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry.key; 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }); 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }, this); 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Associate the specified value with the specified key in this 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable}. If the key already exists, the old value is replaced. 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The key and value cannot be null. 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to add. 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value to add. 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the old value associated with the specified key, or {@code null} 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the key did not exist. 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #elements 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #get 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #keys 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Object#equals 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized V put(K key, V value) { 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key != null && value != null) { 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = key.hashCode(); 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (hash & 0x7FFFFFFF) % elementData.length; 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[index]; 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null && !entry.equalsKey(key, hash)) { 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry == null) { 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modCount++; 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (++elementCount > threshold) { 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project rehash(); 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index = (hash & 0x7FFFFFFF) % elementData.length; 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < firstSlot) { 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project firstSlot = index; 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index > lastSlot) { 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastSlot = index; 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = newEntry(key, value, hash); 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.next = elementData[index]; 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData[index] = entry; 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project V result = entry.value; 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.value = value; 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copies every mapping to this {@code Hashtable} from the specified map. 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the map to copy mappings from. 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void putAll(Map<? extends K, ? extends V> map) { 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) { 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project put(entry.getKey(), entry.getValue()); 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Increases the capacity of this {@code Hashtable}. This method is called 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the size of this {@code Hashtable} exceeds the load factor. 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void rehash() { 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = (elementData.length << 1) + 1; 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (length == 0) { 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project length = 1; 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newFirst = length; 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newLast = -1; 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V>[] newData = newElementArray(length); 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = lastSlot + 1; --i >= firstSlot;) { 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[i]; 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (entry.getKeyHash() & 0x7FFFFFFF) % length; 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < newFirst) { 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newFirst = index; 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index > newLast) { 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newLast = index; 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> next = entry.next; 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.next = newData[index]; 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newData[index] = entry; 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = next; 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project firstSlot = newFirst; 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastSlot = newLast; 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData = newData; 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project computeMaxSize(); 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes the key/value pair with the specified key from this 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Hashtable}. 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to remove. 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value associated with the specified key, or {@code null} if 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified key did not exist. 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #get 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #put 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized V remove(Object key) { 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = key.hashCode(); 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (hash & 0x7FFFFFFF) % elementData.length; 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> last = null; 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[index]; 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null && !entry.equalsKey(key, hash)) { 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project last = entry; 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry != null) { 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modCount++; 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (last == null) { 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData[index] = entry.next; 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project last.next = entry.next; 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount--; 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project V result = entry.value; 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.value = null; 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of key/value pairs in this {@code Hashtable}. 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of key/value pairs in this {@code Hashtable}. 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #elements 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #keys 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized int size() { 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elementCount; 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the string representation of this {@code Hashtable}. 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string representation of this {@code Hashtable}. 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized String toString() { 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isEmpty()) { 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return "{}"; //$NON-NLS-1$ 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder buffer = new StringBuilder(size() * 28); 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append('{'); 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = lastSlot; i >= firstSlot; i--) { 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[i]; 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry.key != this) { 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append(entry.key); 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // luni.04=this Map 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append("(" + Messages.getString("luni.04") + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append('='); 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry.value != this) { 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append(entry.value); 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // luni.04=this Map 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append("(" + Messages.getString("luni.04") + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append(", "); //$NON-NLS-1$ 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Remove the last ", " 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementCount > 0) { 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.setLength(buffer.length() - 2); 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer.append('}'); 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buffer.toString(); 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a collection of the values contained in this {@code Hashtable}. 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The collection is backed by this {@code Hashtable} so changes to one are 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reflected by the other. The collection does not support adding. 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a collection of the values. 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Collection<V> values() { 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Collections.SynchronizedCollection<V>( 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new AbstractCollection<V>() { 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean contains(Object object) { 886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Hashtable.this.contains(object); 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (Hashtable.this) { 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return elementCount; 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable.this.clear(); 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<V> iterator() { 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new HashIterator<V>( 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new MapEntry.Type<V, K, V>() { 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public V get(MapEntry<K, V> entry) { 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return entry.value; 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }); 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }, this); 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private synchronized void writeObject(ObjectOutputStream stream) 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.writeInt(elementData.length); 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.writeInt(elementCount); 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = elementData.length; --i >= 0;) { 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = elementData[i]; 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entry != null) { 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.writeObject(entry.key); 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.writeObject(entry.value); 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = entry.next; 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readObject(ObjectInputStream stream) throws IOException, 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException { 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultReadObject(); 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = stream.readInt(); 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData = newElementArray(length); 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementCount = stream.readInt(); 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = elementCount; --i >= 0;) { 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object key = stream.readObject(); 939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = key.hashCode(); 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = (hash & 0x7FFFFFFF) % length; 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < firstSlot) { 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project firstSlot = index; 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index > lastSlot) { 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastSlot = index; 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Entry<K, V> entry = newEntry((K) key, (V) stream.readObject(), hash); 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.next = elementData[index]; 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementData[index] = entry; 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 953