abstractmap.java

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

JAVA
688
字号
     * 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();    }    // Views    /**     * Each of these fields are initialized to contain an instance of the     * appropriate view the first time this view is requested.  The views are     * stateless, so there's no reason to create more than one of each.     */    transient volatile Set        keySet = null;    transient volatile Collection values = null;    /**     * Returns a Set view of the keys contained in this map.  The Set is     * backed by the map, so changes to the map are reflected in the Set,     * and vice-versa.  (If the map is modified while an iteration over     * the Set is in progress, the results of the iteration are undefined.)     * The Set supports element removal, which removes the corresponding entry     * from the map, via the Iterator.remove, Set.remove,  removeAll     * retainAll, and clear operations.  It does not support the add or     * addAll operations.<p>     *     * This implementation returns a Set that subclasses     * AbstractSet.  The subclass's iterator method returns a "wrapper     * object" over this map's entrySet() iterator.  The size method delegates     * to this map's size method and the contains method delegates to this     * map's containsKey method.<p>     *     * The Set is created the first time this method is called,     * and returned in response to all subsequent calls.  No synchronization     * is performed, so there is a slight chance that multiple calls to this     * method will not all return the same Set.     *     * @return a Set view of the keys contained in this map.     */    public Set keySet() {	if (keySet == null) {	    keySet = new AbstractSet() {		public Iterator iterator() {		    return new Iterator() {			private Iterator i = entrySet().iterator();			public boolean hasNext() {			    return i.hasNext();			}			public Object next() {			    return ((Entry)i.next()).getKey();			}			public void remove() {			    i.remove();			}                    };		}		public int size() {		    return AbstractMap.this.size();		}		public boolean contains(Object k) {		    return AbstractMap.this.containsKey(k);		}	    };	}	return keySet;    }    /**     * Returns a collection view of the values contained in this map.  The     * collection is backed by the map, so changes to the map are reflected in     * the collection, and vice-versa.  (If the map is modified while an     * iteration over the collection is in progress, the results of the     * iteration are undefined.)  The collection supports element removal,     * which removes the corresponding entry from the map, via the     * <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,     * <tt>removeAll</tt>, <tt>retainAll</tt> and <tt>clear</tt> operations.     * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.<p>     *     * This implementation returns a collection that subclasses abstract     * collection.  The subclass's iterator method returns a "wrapper object"     * over this map's <tt>entrySet()</tt> iterator.  The size method     * delegates to this map's size method and the contains method delegates     * to this map's containsValue method.<p>     *     * The collection is created the first time this method is called, and     * returned in response to all subsequent calls.  No synchronization is     * performed, so there is a slight chance that multiple calls to this     * method will not all return the same Collection.     *     * @return a collection view of the values contained in this map.     */    public Collection values() {	if (values == null) {	    values = new AbstractCollection() {		public Iterator iterator() {		    return new Iterator() {			private Iterator i = entrySet().iterator();			public boolean hasNext() {			    return i.hasNext();			}			public Object next() {			    return ((Entry)i.next()).getValue();			}			public void remove() {			    i.remove();			}                    };                }		public int size() {		    return AbstractMap.this.size();		}		public boolean contains(Object v) {		    return AbstractMap.this.containsValue(v);		}	    };	}	return values;    }    /**     * Returns a set view of the mappings contained in this map.  Each element     * in this set is a Map.Entry.  The set is backed by the map, so changes     * to the map are reflected in the set, and vice-versa.  (If the map is     * modified while an iteration over the set is in progress, the results of     * the iteration are undefined.)  The set supports element removal, which     * removes the corresponding entry from the map, via the     * <tt>Iterator.remove</tt>, <tt>Set.remove</tt>, <tt>removeAll</tt>,     * <tt>retainAll</tt> and <tt>clear</tt> operations.  It does not support     * the <tt>add</tt> or <tt>addAll</tt> operations.     *     * @return a set view of the mappings contained in this map.     */    public abstract Set entrySet();    // Comparison and hashing    /**     * Compares the specified object with this map for equality.  Returns     * <tt>true</tt> if the given object is also a map and the two maps     * represent the same mappings.  More formally, two maps <tt>t1</tt> and     * <tt>t2</tt> represent the same mappings if     * <tt>t1.keySet().equals(t2.keySet())</tt> and for every key <tt>k</tt>     * in <tt>t1.keySet()</tt>, <tt> (t1.get(k)==null ? t2.get(k)==null :     * t1.get(k).equals(t2.get(k))) </tt>.  This ensures that the     * <tt>equals</tt> method works properly across different implementations     * of the map interface.<p>     *     * This implementation first checks if the specified object is this map;     * if so it returns <tt>true</tt>.  Then, it checks if the specified     * object is a map whose size is identical to the size of this set; if     * not, it it returns <tt>false</tt>.  If so, it iterates over this map's     * <tt>entrySet</tt> collection, and checks that the specified map     * contains each mapping that this map contains.  If the specified map     * fails to contain such a mapping, <tt>false</tt> is returned.  If the     * iteration completes, <tt>true</tt> is returned.     *     * @param o object to be compared for equality with this map.     * @return <tt>true</tt> if the specified object is equal to this map.     */    public 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()) {                Entry e = (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.  The hash code of a map is     * defined to be the sum of the hash codes of each entry in the map's     * <tt>entrySet()</tt> view.  This ensures that <tt>t1.equals(t2)</tt>     * implies that <tt>t1.hashCode()==t2.hashCode()</tt> for any two maps     * <tt>t1</tt> and <tt>t2</tt>, as required by the general contract of     * Object.hashCode.<p>     *     * This implementation iterates over <tt>entrySet()</tt>, calling     * <tt>hashCode</tt> on each element (entry) in the Collection, and adding     * up the results.     *     * @return the hash code value for this map.     * @see Map.Entry#hashCode()     * @see Object#hashCode()     * @see Object#equals(Object)     * @see Set#equals(Object)     */    public int hashCode() {	int h = 0;	Iterator i = entrySet().iterator();	while (i.hasNext())	    h += i.next().hashCode();	return h;    }    /**     * Returns a string representation of this map.  The string representation     * consists of a list of key-value mappings in the order returned by the     * map's <tt>entrySet</tt> view's iterator, enclosed in braces     * (<tt>"{}"</tt>).  Adjacent mappings are separated by the characters     * <tt>", "</tt> (comma and space).  Each key-value mapping is rendered as     * the key followed by an equals sign (<tt>"="</tt>) followed by the     * associated value.  Keys and values are converted to strings as by     * <tt>String.valueOf(Object)</tt>.<p>     *     * This implementation creates an empty string buffer, appends a left     * brace, and iterates over the map's <tt>entrySet</tt> view, appending     * the string representation of each <tt>map.entry</tt> in turn.  After     * appending each entry except the last, the string <tt>", "</tt> is     * appended.  Finally a right brace is appended.  A string is obtained     * from the stringbuffer, and returned.     *     * @return a String representation of this map.     */    public String toString() {	StringBuffer buf = new StringBuffer();	buf.append("{");	Iterator i = entrySet().iterator();        boolean hasNext = i.hasNext();        while (hasNext) {	    Entry e = (Entry) (i.next());            Object key = e.getKey();            Object value = e.getValue();            buf.append((key == this ?  "(this Map)" : key) + "=" +                        (value == this ? "(this Map)": value));            hasNext = i.hasNext();            if (hasNext)                buf.append(", ");        }	buf.append("}");	return buf.toString();    }        /**     * Returns a shallow copy of this <tt>AbstractMap</tt> instance: the keys     * and values themselves are not cloned.     *     * @return a shallow copy of this map.     */    protected Object clone() throws CloneNotSupportedException {        AbstractMap result = (AbstractMap)super.clone();        result.keySet = null;        result.values = null;        return result;    }    /**     * This should be made public as soon as possible.  It greately simplifies     * the task of implementing Map.     */    static class SimpleEntry implements Entry {	Object key;	Object value;	public SimpleEntry(Object key, Object value) {	    this.key   = key;            this.value = value;	}	public SimpleEntry(Map.Entry e) {	    this.key   = e.getKey();            this.value = e.getValue();	}	public Object getKey() {	    return key;	}	public Object getValue() {	    return value;	}	public Object setValue(Object value) {	    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 eq(key, e.getKey()) &&  eq(value, e.getValue());	}	public int hashCode() {	    Object v;	    return ((key   == null)   ? 0 :   key.hashCode()) ^		   ((value == null)   ? 0 : value.hashCode());	}	public String toString() {	    return key + "=" + value;	}        private static boolean eq(Object o1, Object o2) {            return (o1 == null ? o2 == null : o1.equals(o2));        }    }}

⌨️ 快捷键说明

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