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