hashtable.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 1,103 行 · 第 1/3 页

JAVA
1,103
字号
/* * @(#)Hashtable.java	1.90 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved.   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER   *    * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License version   * 2 only, as published by the Free Software Foundation.    *    * This program is distributed in the hope that it will be useful, but   * WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * General Public License version 2 for more details (a copy is   * included at /legal/license.txt).    *    * You should have received a copy of the GNU General Public License   * version 2 along with this work; if not, write to the Free Software   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA   * 02110-1301 USA    *    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa   * Clara, CA 95054 or visit www.sun.com if you need additional   * information or have any questions.  * */package java.util;import java.io.*;import sun.misc.CVM;/** * This class implements a hashtable, which maps keys to values. Any  * non-<code>null</code> object can be used as a key or as a value. <p> * * To successfully store and retrieve objects from a hashtable, the  * objects used as keys must implement the <code>hashCode</code>  * method and the <code>equals</code> method. <p> * * An instance of <code>Hashtable</code> has two parameters that affect its * performance: <i>initial capacity</i> and <i>load factor</i>.  The * <i>capacity</i> is the number of <i>buckets</i> in the hash table, and the * <i>initial capacity</i> is simply the capacity at the time the hash table * is created.  Note that the hash table is <i>open</i>: in the case of a "hash * collision", a single bucket stores multiple entries, which must be searched * sequentially.  The <i>load factor</i> is a measure of how full the hash * table is allowed to get before its capacity is automatically increased. * When the number of entries in the hashtable exceeds the product of the load * factor and the current capacity, the capacity is increased by calling the * <code>rehash</code> method.<p> * * Generally, the default load factor (.75) offers a good tradeoff between * time and space costs.  Higher values decrease the space overhead but * increase the time cost to look up an entry (which is reflected in most * <tt>Hashtable</tt> operations, including <tt>get</tt> and <tt>put</tt>).<p> * * The initial capacity controls a tradeoff between wasted space and the * need for <code>rehash</code> operations, which are time-consuming. * No <code>rehash</code> operations will <i>ever</i> occur if the initial * capacity is greater than the maximum number of entries the * <tt>Hashtable</tt> will contain divided by its load factor.  However, * setting the initial capacity too high can waste space.<p> * * If many entries are to be made into a <code>Hashtable</code>,  * creating it with a sufficiently large capacity may allow the  * entries to be inserted more efficiently than letting it perform  * automatic rehashing as needed to grow the table. <p> * * This example creates a hashtable of numbers. It uses the names of  * the numbers as keys: * <p><blockquote><pre> *     Hashtable numbers = new Hashtable(); *     numbers.put("one", new Integer(1)); *     numbers.put("two", new Integer(2)); *     numbers.put("three", new Integer(3)); * </pre></blockquote> * <p> * To retrieve a number, use the following code:  * <p><blockquote><pre> *     Integer n = (Integer)numbers.get("two"); *     if (n != null) { *         System.out.println("two = " + n); *     } * </pre></blockquote> * <p> * As of the Java 2 platform v1.2, this class has been retrofitted to * implement Map, so that it becomes a part of Java's collection framework. * Unlike the new collection implementations, Hashtable is synchronized.<p> * * The Iterators returned by the iterator and listIterator methods * of the Collections returned by all of Hashtable's "collection view methods" * are <em>fail-fast</em>: if the Hashtable is structurally modified * at any time after the Iterator is created, in any way except through the * Iterator's own remove or add methods, the Iterator will throw a * ConcurrentModificationException.  Thus, in the face of concurrent * modification, the Iterator fails quickly and cleanly, rather than risking * arbitrary, non-deterministic behavior at an undetermined time in the future. * The Enumerations returned by Hashtable's keys and values methods are * <em>not</em> fail-fast. * * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification.  Fail-fast iterators * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.  * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i><p> * * This class is a member of the  * <a href="{@docRoot}/../guide/collections/index.html"> * Java Collections Framework</a>. * * @author  Arthur van Hoff * @author  Josh Bloch * @version 1.82, 02/02/00 * @see     Object#equals(java.lang.Object) * @see     Object#hashCode() * @see     Hashtable#rehash() * @see     Collection * @see	    Map * @see	    HashMap * @see	    TreeMap * @since JDK1.0 */public class Hashtable extends Dictionary implements Map, Cloneable,                                                   java.io.Serializable {    /**     * The hash table data.     */    private transient Entry table[];    /**     * The total number of entries in the hash table.     */    private transient int count;    /**     * The table is rehashed when its size exceeds this threshold.  (The     * value of this field is (int)(capacity * loadFactor).)     *     * @serial     */    private int threshold;							     /**     * The load factor for the hashtable.     *     * @serial     */    private float loadFactor;    /**     * The number of times this Hashtable has been structurally modified     * Structural modifications are those that change the number of entries in     * the Hashtable or otherwise modify its internal structure (e.g.,     * rehash).  This field is used to make iterators on Collection-views of     * the Hashtable fail-fast.  (See ConcurrentModificationException).     */    private transient int modCount = 0;    /** use serialVersionUID from JDK 1.0.2 for interoperability */    private static final long serialVersionUID = 1421746759512286392L;    /**     * Constructs a new, empty hashtable with the specified initial      * capacity and the specified load factor.     *     * @param      initialCapacity   the initial capacity of the hashtable.     * @param      loadFactor        the load factor of the hashtable.     * @exception  IllegalArgumentException  if the initial capacity is less     *             than zero, or if the load factor is nonpositive.     */    public Hashtable(int initialCapacity, float loadFactor) {	if (initialCapacity < 0)	    throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);        if (loadFactor <= 0 || Float.isNaN(loadFactor))            throw new IllegalArgumentException("Illegal Load: "+loadFactor);        if (initialCapacity==0)            initialCapacity = 1;	this.loadFactor = loadFactor;	table = new Entry[initialCapacity];	threshold = (int)(initialCapacity * loadFactor);    }    /**     * Constructs a new, empty hashtable with the specified initial capacity     * and default load factor, which is <tt>0.75</tt>.     *     * @param     initialCapacity   the initial capacity of the hashtable.     * @exception IllegalArgumentException if the initial capacity is less     *              than zero.     */    public Hashtable(int initialCapacity) {	this(initialCapacity, 0.75f);    }    /**     * Constructs a new, empty hashtable with a default initial capacity (11)     * and load factor, which is <tt>0.75</tt>.      */    public Hashtable() {	this(11, 0.75f);    }    /**     * Constructs a new hashtable with the same mappings as the given      * Map.  The hashtable is created with an initial capacity sufficient to     * hold the mappings in the given Map and a default load factor, which is     * <tt>0.75</tt>.     *     * @param t the map whose mappings are to be placed in this map.     * @throws NullPointerException if the specified map is null.     * @since   1.2     */    public Hashtable(Map t) {	this(Math.max(2*t.size(), 11), 0.75f);	putAll(t);    }    /**     * Returns the number of keys in this hashtable.     *     * @return  the number of keys in this hashtable.     */    public synchronized int size() {	return count;    }    private int sizeSimpleSync() { 	if (CVM.simpleLockGrab(this)) {	    int result = count;	    CVM.simpleLockRelease(this);	    return result;	} else {	    return size();	}    }    /**     * Tests if this hashtable maps no keys to values.     *     * @return  <code>true</code> if this hashtable maps no keys to values;     *          <code>false</code> otherwise.     */    public synchronized boolean isEmpty() {	return count == 0;    }    private boolean isEmptySimpleSync() { 	if (CVM.simpleLockGrab(this)) {	    boolean result = count == 0;	    CVM.simpleLockRelease(this);	    return result;	} else {	    return isEmpty();	}    }    /**     * Returns an enumeration of the keys in this hashtable.     *     * @return  an enumeration of the keys in this hashtable.     * @see     Enumeration     * @see     #elements()     * @see	#keySet()     * @see	Map     */    public synchronized Enumeration keys() {	return getEnumeration(KEYS);    }    /**     * Returns an enumeration of the values in this hashtable.     * Use the Enumeration methods on the returned object to fetch the elements     * sequentially.     *     * @return  an enumeration of the values in this hashtable.     * @see     java.util.Enumeration     * @see     #keys()     * @see	#values()     * @see	Map     */    public synchronized Enumeration elements() {	return getEnumeration(VALUES);    }    /**     * Tests if some key maps into the specified value in this hashtable.     * This operation is more expensive than the <code>containsKey</code>     * method.<p>     *     * Note that this method is identical in functionality to containsValue,     * (which is part of the Map interface in the collections framework).     *      * @param      value   a value to search for.     * @return     <code>true</code> if and only if some key maps to the     *             <code>value</code> argument in this hashtable as      *             determined by the <tt>equals</tt> method;     *             <code>false</code> otherwise.     * @exception  NullPointerException  if the value is <code>null</code>.     * @see        #containsKey(Object)     * @see        #containsValue(Object)     * @see	   Map     */    public synchronized boolean contains(Object value) {	if (value == null) {	    throw new NullPointerException();	}	Entry tab[] = table;	for (int i = tab.length ; i-- > 0 ;) {	    for (Entry e = tab[i] ; e != null ; e = e.next) {		if (e.value.equals(value)) {		    return true;		}	    }	}	return false;    }    /**     * Returns true if this Hashtable maps one or more keys to this value.<p>     *     * Note that this method is identical in functionality to contains     * (which predates the Map interface).     *     * @param value value whose presence in this Hashtable is to be tested.     * @return <tt>true</tt> if this map maps one or more keys to the     *         specified value.     * @throws NullPointerException  if the value is <code>null</code>.     * @see	   Map     * @since 1.2     */    public boolean containsValue(Object value) {	return contains(value);    }    /**     * Tests if the specified object is a key in this hashtable.     *      * @param   key   possible key.     * @return  <code>true</code> if and only if the specified object      *          is a key in this hashtable, as determined by the      *          <tt>equals</tt> method; <code>false</code> otherwise.     * @throws  NullPointerException  if the key is <code>null</code>.     * @see     #contains(Object)     */    public synchronized boolean containsKey(Object key) {	Entry tab[] = table;	int hash = key.hashCode();	int index = (hash & 0x7FFFFFFF) % tab.length;	for (Entry e = tab[index] ; e != null ; e = e.next) {	    if ((e.hash == hash) && e.key.equals(key)) {		return true;	    }	}	return false;    }    /**     * Returns the value to which the specified key is mapped in this hashtable.     *     * @param   key   a key in the hashtable.     * @return  the value to which the key is mapped in this hashtable;     *          <code>null</code> if the key is not mapped to any value in

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?