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

📄 linkedhashmap.java

📁 java源代码 请看看啊 提点宝贵的意见
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    /**     * Returns <tt>true</tt> if this map maps one or more keys to the     * specified value.     *     * @param value value whose presence in this map is to be tested.     * @return <tt>true</tt> if this map maps one or more keys to the     *         specified value.     */    public boolean containsValue(Object value) {        // Overridden to take advantage of faster iterator        if (value==null) {            for (Entry e = header.after; e != header; e = e.after)                if (e.value==null)                    return true;        } else {            for (Entry e = header.after; e != header; e = e.after)                if (value.equals(e.value))                    return true;        }        return false;    }    /**     * Returns the value to which this map maps the specified key.  Returns     * <tt>null</tt> if the map contains no mapping for this key.  A return     * value of <tt>null</tt> does not <i>necessarily</i> indicate that the     * map contains no mapping for the key; it's also possible that the map     * explicitly maps the key to <tt>null</tt>.  The <tt>containsKey</tt>     * operation may be used to distinguish these two cases.     *     * @return the value to which this map maps the specified key.     * @param key key whose associated value is to be returned.     */    public Object get(Object key) {        Entry e = (Entry)getEntry(key);        if (e == null)            return null;        e.recordAccess(this);        return e.value;    }    /**     * Removes all mappings from this map.     */    public void clear() {        super.clear();        header.before = header.after = header;    }    /**     * LinkedHashMap entry.     */    private static class Entry extends HashMap.Entry {        // These fields comprise the doubly linked list used for iteration.        Entry before, after;	Entry(int hash, Object key, Object value, HashMap.Entry next) {            super(hash, key, value, next);        }        /**         * Remove this entry from the linked list.         */        private void remove() {            before.after = after;            after.before = before;        }        /**                                                      * Insert this entry before the specified existing entry in the list.         */        private void addBefore(Entry existingEntry) {            after  = existingEntry;            before = existingEntry.before;            before.after = this;            after.before = this;        }        /**         * This method is invoked by the superclass whenever the value         * of a pre-existing entry is read by Map.get or modified by Map.set.         * If the enclosing Map is access-ordered, it moves the entry         * to the end of the list; otherwise, it does nothing.          */        void recordAccess(HashMap m) {            LinkedHashMap lm = (LinkedHashMap)m;            if (lm.accessOrder) {                lm.modCount++;                remove();                addBefore(lm.header);            }        }        void recordRemoval(HashMap m) {            remove();        }    }    private abstract class LinkedHashIterator implements Iterator {	Entry nextEntry    = header.after;	Entry lastReturned = null;	/**	 * The modCount value that the iterator believes that the backing	 * List should have.  If this expectation is violated, the iterator	 * has detected concurrent modification.	 */	int expectedModCount = modCount;	public boolean hasNext() {            return nextEntry != header;	}	public void remove() {	    if (lastReturned == null)		throw new IllegalStateException();	    if (modCount != expectedModCount)		throw new ConcurrentModificationException();            LinkedHashMap.this.remove(lastReturned.key);            lastReturned = null;            expectedModCount = modCount;	}	Entry nextEntry() {	    if (modCount != expectedModCount)		throw new ConcurrentModificationException();            if (nextEntry == header)                throw new NoSuchElementException();            Entry e = lastReturned = nextEntry;            nextEntry = e.after;            return e;	}    }    private class KeyIterator extends LinkedHashIterator {	public Object next() { return nextEntry().getKey(); }    }    private class ValueIterator extends LinkedHashIterator {	public Object next() { return nextEntry().value; }    }    private class EntryIterator extends LinkedHashIterator {	public Object next() { return nextEntry(); }    }    // These Overrides alter the behavior of superclass view iterator() methods    Iterator newKeyIterator()   { return new KeyIterator();   }    Iterator newValueIterator() { return new ValueIterator(); }    Iterator newEntryIterator() { return new EntryIterator(); }    /**     * This override alters behavior of superclass put method. It causes newly     * allocated entry to get inserted at the end of the linked list and     * removes the eldest entry if appropriate.     */    void addEntry(int hash, Object key, Object value, int bucketIndex) {        createEntry(hash, key, value, bucketIndex);        // Remove eldest entry if instructed, else grow capacity if appropriate        Entry eldest = header.after;        if (removeEldestEntry(eldest)) {            removeEntryForKey(eldest.key);        } else {            if (size >= threshold)                 resize(2 * table.length);        }    }    /**     * This override differs from addEntry in that it doesn't resize the     * table or remove the eldest entry.     */    void createEntry(int hash, Object key, Object value, int bucketIndex) {        Entry e = new Entry(hash, key, value, table[bucketIndex]);        table[bucketIndex] = e;        e.addBefore(header);        size++;    }    /**     * Returns <tt>true</tt> if this map should remove its eldest entry.     * This method is invoked by <tt>put</tt> and <tt>putAll</tt> after     * inserting a new entry into the map.  It provides the implementer     * with the opportunity to remove the eldest entry each time a new one     * is added.  This is useful if the map represents a cache: it allows     * the map to reduce memory consumption by deleting stale entries.     *     * <p>Sample use: this override will allow the map to grow up to 100     * entries and then delete the eldest entry each time a new entry is     * added, maintaining a steady state of 100 entries.     * <pre>     *     private static final int MAX_ENTRIES = 100;     *     *     protected boolean removeEldestEntry(Map.Entry eldest) {     *        return size() > MAX_ENTRIES;     *     }     * </pre>     *     * <p>This method typically does not modify the map in any way,     * instead allowing the map to modify itself as directed by its     * return value.  It <i>is</i> permitted for this method to modify     * the map directly, but if it does so, it <i>must</i> return     * <tt>false</tt> (indicating that the map should not attempt any     * further modification).  The effects of returning <tt>true</tt>     * after modifying the map from within this method are unspecified.     *     * <p>This implementation merely returns <tt>false</tt> (so that this     * map acts like a normal map - the eldest element is never removed).     *     * @param    eldest The least recently inserted entry in the map, or if      *           this is an access-ordered map, the least recently accessed     *           entry.  This is the entry that will be removed it this     *           method returns <tt>true</tt>.  If the map was empty prior     *           to the <tt>put</tt> or <tt>putAll</tt> invocation resulting     *           in this invocation, this will be the entry that was just     *           inserted; in other words, if the map contains a single     *           entry, the eldest entry is also the newest.     * @return   <tt>true</tt> if the eldest entry should be removed     *           from the map; <tt>false</t> if it should be retained.     */    protected boolean removeEldestEntry(Map.Entry eldest) {        return false;    }}

⌨️ 快捷键说明

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