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

📄 hashtable.java

📁 java源代码 请看看啊 提点宝贵的意见
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     * Compares the specified Object with this Map for equality,     * as per the definition in the Map interface.     *     * @param  o object to be compared for equality with this Hashtable     * @return true if the specified Object is equal to this Map.     * @see Map#equals(Object)     * @since 1.2     */    public synchronized boolean equals(Object o) {	if (o == this)	    return true;	if (!(o instanceof Map))	    return false;	Map t = (Map) o;	if (t.size() != size())	    return false;        try {            Iterator i = entrySet().iterator();            while (i.hasNext()) {                Map.Entry e = (Map.Entry) i.next();                Object key = e.getKey();                Object value = e.getValue();                if (value == null) {                    if (!(t.get(key)==null && t.containsKey(key)))                        return false;                } else {                    if (!value.equals(t.get(key)))                        return false;                }            }        } catch(ClassCastException unused)   {            return false;        } catch(NullPointerException unused) {            return false;        }	return true;    }    /**     * Returns the hash code value for this Map as per the definition in the     * Map interface.     *     * @see Map#hashCode()     * @since 1.2     */    public synchronized int hashCode() {        /*         * This code detects the recursion caused by computing the hash code         * of a self-referential hash table and prevents the stack overflow         * that would otherwise result.  This allows certain 1.1-era         * applets with self-referential hash tables to work.  This code         * abuses the loadFactor field to do double-duty as a hashCode         * in progress flag, so as not to worsen the space performance.         * A negative load factor indicates that hash code computation is         * in progress.         */        int h = 0;        if (count == 0 || loadFactor < 0)            return h;  // Returns zero        loadFactor = -loadFactor;  // Mark hashCode computation in progress        Entry tab[] = table;        for (int i = 0; i < tab.length; i++)            for (Entry e = tab[i]; e != null; e = e.next)                h += e.key.hashCode() ^ e.value.hashCode();        loadFactor = -loadFactor;  // Mark hashCode computation complete	return h;    }    /**     * Save the state of the Hashtable to a stream (i.e., serialize it).     *     * @serialData The <i>capacity</i> of the Hashtable (the length of the     *		   bucket array) is emitted (int), followed  by the     *		   <i>size</i> of the Hashtable (the number of key-value     *		   mappings), followed by the key (Object) and value (Object)     *		   for each key-value mapping represented by the Hashtable     *		   The key-value mappings are emitted in no particular order.     */    private synchronized void writeObject(java.io.ObjectOutputStream s)        throws IOException    {	// Write out the length, threshold, loadfactor	s.defaultWriteObject();	// Write out length, count of elements and then the key/value objects	s.writeInt(table.length);	s.writeInt(count);	for (int index = table.length-1; index >= 0; index--) {	    Entry entry = table[index];	    while (entry != null) {		s.writeObject(entry.key);		s.writeObject(entry.value);		entry = entry.next;	    }	}    }    /**     * Reconstitute the Hashtable from a stream (i.e., deserialize it).     */    private void readObject(java.io.ObjectInputStream s)         throws IOException, ClassNotFoundException    {	// Read in the length, threshold, and loadfactor	s.defaultReadObject();	// Read the original length of the array and number of elements	int origlength = s.readInt();	int elements = s.readInt();	// Compute new size with a bit of room 5% to grow but	// No larger than the original size.  Make the length	// odd if it's large enough, this helps distribute the entries.	// Guard against the length ending up zero, that's not valid.	int length = (int)(elements * loadFactor) + (elements / 20) + 3;	if (length > elements && (length & 1) == 0)	    length--;	if (origlength > 0 && length > origlength)	    length = origlength;	table = new Entry[length];	count = 0;	// Read the number of elements and then all the key/value objects	for (; elements > 0; elements--) {	    Object key = s.readObject();	    Object value = s.readObject();	    put(key, value);  // synch could be eliminated for performance	}    }    /**     * Hashtable collision list.     */    private static class Entry implements Map.Entry {	int hash;	Object key;	Object value;	Entry next;	protected Entry(int hash, Object key, Object value, Entry next) {	    this.hash = hash;	    this.key = key;	    this.value = value;	    this.next = next;	}	protected Object clone() {	    return new Entry(hash, key, value,			     (next==null ? null : (Entry)next.clone()));	}	// Map.Entry Ops 	public Object getKey() {	    return key;	}	public Object getValue() {	    return value;	}	public Object setValue(Object value) {	    if (value == null)		throw new NullPointerException();	    Object oldValue = this.value;	    this.value = value;	    return oldValue;	}	public boolean equals(Object o) {	    if (!(o instanceof Map.Entry))		return false;	    Map.Entry e = (Map.Entry)o;	    return (key==null ? e.getKey()==null : key.equals(e.getKey())) &&	       (value==null ? e.getValue()==null : value.equals(e.getValue()));	}	public int hashCode() {	    return hash ^ (value==null ? 0 : value.hashCode());	}	public String toString() {	    return key.toString()+"="+value.toString();	}    }    // Types of Enumerations/Iterations    private static final int KEYS = 0;    private static final int VALUES = 1;    private static final int ENTRIES = 2;    /**     * A hashtable enumerator class.  This class implements both the     * Enumeration and Iterator interfaces, but individual instances     * can be created with the Iterator methods disabled.  This is necessary     * to avoid unintentionally increasing the capabilities granted a user     * by passing an Enumeration.     */    private class Enumerator implements Enumeration, Iterator {	Entry[] table = Hashtable.this.table;	int index = table.length;	Entry entry = null;	Entry lastReturned = null;	int type;	/**	 * Indicates whether this Enumerator is serving as an Iterator	 * or an Enumeration.  (true -> Iterator).	 */	boolean iterator;	/**	 * The modCount value that the iterator believes that the backing	 * List should have.  If this expectation is violated, the iterator	 * has detected concurrent modification.	 */	protected int expectedModCount = modCount;	Enumerator(int type, boolean iterator) {	    this.type = type;	    this.iterator = iterator;	}	public boolean hasMoreElements() {	    Entry e = entry;	    int i = index;	    Entry t[] = table;	    /* Use locals for faster loop iteration */	    while (e == null && i > 0) { 		e = t[--i];	    }	    entry = e;	    index = i;	    return e != null;	}	public Object nextElement() {	    Entry et = entry;	    int i = index;	    Entry t[] = table;	    /* Use locals for faster loop iteration */	    while (et == null && i > 0) { 		et = t[--i];	    }	    entry = et;	    index = i;	    if (et != null) {		Entry e = lastReturned = entry;		entry = e.next;		return type == KEYS ? e.key : (type == VALUES ? e.value : e);	    }	    throw new NoSuchElementException("Hashtable Enumerator");	}	// Iterator methods	public boolean hasNext() {	    return hasMoreElements();	}	public Object next() {	    if (modCount != expectedModCount)		throw new ConcurrentModificationException();	    return nextElement();	}	public void remove() {	    if (!iterator)		throw new UnsupportedOperationException();	    if (lastReturned == null)		throw new IllegalStateException("Hashtable Enumerator");	    if (modCount != expectedModCount)		throw new ConcurrentModificationException();	    synchronized(Hashtable.this) {		Entry[] tab = Hashtable.this.table;		int index = (lastReturned.hash & 0x7FFFFFFF) % tab.length;		for (Entry e = tab[index], prev = null; e != null;		     prev = e, e = e.next) {		    if (e == lastReturned) {			modCount++;			expectedModCount++;			if (prev == null)			    tab[index] = e.next;			else			    prev.next = e.next;			count--;			lastReturned = null;			return;		    }		}		throw new ConcurrentModificationException();	    }	}    }       private static EmptyEnumerator emptyEnumerator = new EmptyEnumerator();    private static EmptyIterator emptyIterator = new EmptyIterator();    /**     * A hashtable enumerator class for empty hash tables, specializes     * the general Enumerator     */    private static class EmptyEnumerator implements Enumeration {	EmptyEnumerator() {	}	public boolean hasMoreElements() {	    return false;	}	public Object nextElement() {	    throw new NoSuchElementException("Hashtable Enumerator");	}    }    /**     * A hashtable iterator class for empty hash tables     */    private static class EmptyIterator implements Iterator {	EmptyIterator() {	}	public boolean hasNext() {	    return false;	}	public Object next() {	    throw new NoSuchElementException("Hashtable Iterator");	}	public void remove() {	    throw new IllegalStateException("Hashtable Iterator");	}    }}

⌨️ 快捷键说明

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