⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashtable.java

📁 java源代码 请看看啊 提点宝贵的意见
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * @(#)Hashtable.java	1.95 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package java.util;import java.io.*;/** * 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.95, 01/23/03 * @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;    }    /**     * 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;    }    /**     * 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     *          this hashtable.     * @throws  NullPointerException  if the key is <code>null</code>.     * @see     #put(Object, Object)     */    public synchronized Object get(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 e.value;	    }	}	return null;    }    /**     * Increases the capacity of and internally reorganizes this      * hashtable, in order to accommodate and access its entries more      * efficiently.  This method is called automatically when the      * number of keys in the hashtable exceeds this hashtable's capacity      * and load factor.      */    protected void rehash() {	int oldCapacity = table.length;	Entry oldMap[] = table;	int newCapacity = oldCapacity * 2 + 1;

⌨️ 快捷键说明

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