abstractmap.java

来自「java源代码 请看看啊 提点宝贵的意见」· Java 代码 · 共 668 行 · 第 1/2 页

JAVA
668
字号
/* * @(#)AbstractMap.java	1.34 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.util.Map.Entry;/** * This class provides a skeletal implementation of the <tt>Map</tt> * interface, to minimize the effort required to implement this interface. <p> * * To implement an unmodifiable map, the programmer needs only to extend this * class and provide an implementation for the <tt>entrySet</tt> method, which * returns a set-view of the map's mappings.  Typically, the returned set * will, in turn, be implemented atop <tt>AbstractSet</tt>.  This set should * not support the <tt>add</tt> or <tt>remove</tt> methods, and its iterator * should not support the <tt>remove</tt> method.<p> * * To implement a modifiable map, the programmer must additionally override * this class's <tt>put</tt> method (which otherwise throws an * <tt>UnsupportedOperationException</tt>), and the iterator returned by * <tt>entrySet().iterator()</tt> must additionally implement its * <tt>remove</tt> method.<p> * * The programmer should generally provide a void (no argument) and map * constructor, as per the recommendation in the <tt>Map</tt> interface * specification.<p> * * The documentation for each non-abstract methods in this class describes its * implementation in detail.  Each of these methods may be overridden if the * map being implemented admits a more efficient implementation.<p> * * This class is a member of the  * <a href="{@docRoot}/../guide/collections/index.html"> * Java Collections Framework</a>. * * @author  Josh Bloch * @version 1.34, 01/23/03 * @see Map * @see Collection * @since 1.2 */public abstract class AbstractMap implements Map {    /**     * Sole constructor.  (For invocation by subclass constructors, typically     * implicit.)     */    protected AbstractMap() {    }    // Query Operations    /**     * Returns the number of key-value mappings in this map.  If the map     * contains more than <tt>Integer.MAX_VALUE</tt> elements, returns     * <tt>Integer.MAX_VALUE</tt>.<p>     *     * This implementation returns <tt>entrySet().size()</tt>.     *     * @return the number of key-value mappings in this map.     */    public int size() {	return entrySet().size();    }    /**     * Returns <tt>true</tt> if this map contains no key-value mappings. <p>     *     * This implementation returns <tt>size() == 0</tt>.     *     * @return <tt>true</tt> if this map contains no key-value mappings.     */    public boolean isEmpty() {	return size() == 0;    }    /**     * Returns <tt>true</tt> if this map maps one or more keys to this value.     * More formally, returns <tt>true</tt> if and only if this map contains     * at least one mapping to a value <tt>v</tt> such that <tt>(value==null ?     * v==null : value.equals(v))</tt>.  This operation will probably require     * time linear in the map size for most implementations of map.<p>     *     * This implementation iterates over entrySet() searching for an entry     * with the specified value.  If such an entry is found, <tt>true</tt> is     * returned.  If the iteration terminates without finding such an entry,     * <tt>false</tt> is returned.  Note that this implementation requires     * linear time in the size of the map.     *     * @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 this value.     */    public boolean containsValue(Object value) {	Iterator i = entrySet().iterator();	if (value==null) {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (e.getValue()==null)		    return true;	    }	} else {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (value.equals(e.getValue()))		    return true;	    }	}	return false;    }    /**     * Returns <tt>true</tt> if this map contains a mapping for the specified     * key. <p>     *     * This implementation iterates over <tt>entrySet()</tt> searching for an     * entry with the specified key.  If such an entry is found, <tt>true</tt>     * is returned.  If the iteration terminates without finding such an     * entry, <tt>false</tt> is returned.  Note that this implementation     * requires linear time in the size of the map; many implementations will     * override this method.     *     * @param key key whose presence in this map is to be tested.     * @return <tt>true</tt> if this map contains a mapping for the specified     *            key.     *      * @throws NullPointerException key is <tt>null</tt> and this map does not     *            not permit <tt>null</tt> keys.     */    public boolean containsKey(Object key) {	Iterator i = entrySet().iterator();	if (key==null) {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (e.getKey()==null)		    return true;	    }	} else {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (key.equals(e.getKey()))		    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 containsKey operation     * may be used to distinguish these two cases. <p>     *     * This implementation iterates over <tt>entrySet()</tt> searching for an     * entry with the specified key.  If such an entry is found, the entry's     * value is returned.  If the iteration terminates without finding such an     * entry, <tt>null</tt> is returned.  Note that this implementation     * requires linear time in the size of the map; many implementations will     * override this method.     *     * @param key key whose associated value is to be returned.     * @return the value to which this map maps the specified key.     *      * @throws NullPointerException if the key is <tt>null</tt> and this map     *		  does not not permit <tt>null</tt> keys.     *      * @see #containsKey(Object)     */    public Object get(Object key) {	Iterator i = entrySet().iterator();	if (key==null) {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (e.getKey()==null)		    return e.getValue();	    }	} else {	    while (i.hasNext()) {		Entry e = (Entry) i.next();		if (key.equals(e.getKey()))		    return e.getValue();	    }	}	return null;    }    // Modification Operations    /**     * Associates the specified value with the specified key in this map     * (optional operation).  If the map previously contained a mapping for     * this key, the old value is replaced.<p>     *     * This implementation always throws an     * <tt>UnsupportedOperationException</tt>.     *     * @param key key with which the specified value is to be associated.     * @param value value to be associated with the specified key.     *      * @return previous value associated with specified key, or <tt>null</tt>     *	       if there was no mapping for key.  (A <tt>null</tt> return can     *	       also indicate that the map previously associated <tt>null</tt>     *	       with the specified key, if the implementation supports     *	       <tt>null</tt> values.)     *      * @throws UnsupportedOperationException if the <tt>put</tt> operation is     *	          not supported by this map.     *      * @throws ClassCastException if the class of the specified key or value     * 	          prevents it from being stored in this map.     *      * @throws IllegalArgumentException if some aspect of this key or value *     *            prevents it from being stored in this map.     *      * @throws NullPointerException this map does not permit <tt>null</tt>     *            keys or values, and the specified key or value is     *            <tt>null</tt>.     */    public Object put(Object key, Object value) {	throw new UnsupportedOperationException();    }    /**     * Removes the mapping for this key from this map if present (optional     * operation). <p>     *     * This implementation iterates over <tt>entrySet()</tt> searching for an     * entry with the specified key.  If such an entry is found, its value is     * obtained with its <tt>getValue</tt> operation, the entry is is removed     * from the Collection (and the backing map) with the iterator's     * <tt>remove</tt> operation, and the saved value is returned.  If the     * iteration terminates without finding such an entry, <tt>null</tt> is     * returned.  Note that this implementation requires linear time in the     * size of the map; many implementations will override this method.<p>     *     * Note that this implementation throws an     * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt> iterator     * does not support the <tt>remove</tt> method and this map contains a     * mapping for the specified key.     *     * @param key key whose mapping is to be removed from the map.     * @return previous value associated with specified key, or <tt>null</tt>     *	       if there was no entry for key.  (A <tt>null</tt> return can     *	       also indicate that the map previously associated <tt>null</tt>     *	       with the specified key, if the implementation supports     *	       <tt>null</tt> values.)     * @throws UnsupportedOperationException if the <tt>remove</tt> operation     * 		  is not supported by this map.     */    public Object remove(Object key) {	Iterator i = entrySet().iterator();	Entry correctEntry = null;	if (key==null) {	    while (correctEntry==null && i.hasNext()) {		Entry e = (Entry) i.next();		if (e.getKey()==null)		    correctEntry = e;	    }	} else {	    while (correctEntry==null && i.hasNext()) {		Entry e = (Entry) i.next();		if (key.equals(e.getKey()))		    correctEntry = e;	    }	}	Object oldValue = null;	if (correctEntry !=null) {	    oldValue = correctEntry.getValue();	    i.remove();	}	return oldValue;    }    // Bulk Operations    /**     * Copies all of the mappings from the specified map to this map     * (optional operation).  These mappings will replace any mappings that     * this map had for any of the keys currently in the specified map.<p>     *     * This implementation iterates over the specified map's     * <tt>entrySet()</tt> collection, and calls this map's <tt>put</tt>     * operation once for each entry returned by the iteration.<p>     *     * Note that this implementation throws an     * <tt>UnsupportedOperationException</tt> if this map does not support     * the <tt>put</tt> operation and the specified map is nonempty.     *     * @param t mappings to be stored in this map.     *      * @throws UnsupportedOperationException if the <tt>putAll</tt> operation     * 		  is not supported by this map.     *      * @throws ClassCastException if the class of a key or value in the     * 	          specified map prevents it from being stored in this map.     *      * @throws IllegalArgumentException if some aspect of a key or value in     *	          the specified map prevents it from being stored in this map.     * @throws NullPointerException the specified map is <tt>null</tt>, or if     *         this map does not permit <tt>null</tt> keys or values, and the     *         specified map contains <tt>null</tt> keys or values.     */    public void putAll(Map t) {	Iterator i = t.entrySet().iterator();	while (i.hasNext()) {	    Entry e = (Entry) i.next();	    put(e.getKey(), e.getValue());	}    }    /**     * Removes all mappings from this map (optional operation). <p>     *     * This implementation calls <tt>entrySet().clear()</tt>.     *     * Note that this implementation throws an     * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt>     * does not support the <tt>clear</tt> operation.     *     * @throws    UnsupportedOperationException clear is not supported     * 		  by this map.     */    public void clear() {	entrySet().clear();    }

⌨️ 快捷键说明

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