📄 abstractmap.java
字号:
* @throws ClassCastException if the key or value is of the wrong type * @throws IllegalArgumentException if something about this key or value * prevents it from existing in this map * @throws NullPointerException if the map forbids null keys or values * @see #containsKey(Object) */ public Object put(Object key, Object value) { throw new UnsupportedOperationException(); } /** * Copies all entries of the given map to this one (optional operation). If * the map already contains a key, its value is replaced. This implementation * simply iterates over the map's entrySet(), calling <code>put</code>, * so it is not supported if puts are not. * * @param m the mapping to load into this map * @throws UnsupportedOperationException if the operation is not supported * @throws ClassCastException if a key or value is of the wrong type * @throws IllegalArgumentException if something about a key or value * prevents it from existing in this map * @throws NullPointerException if the map forbids null keys or values, or * if <code>m</code> is null. * @see #put(Object, Object) */ public void putAll(Map m) { Iterator entries = m.entrySet().iterator(); int pos = m.size(); while (--pos >= 0) { Map.Entry entry = (Map.Entry) entries.next(); put(entry.getKey(), entry.getValue()); } } /** * Removes the mapping for this key if present (optional operation). This * implementation iterates over the entrySet searching for a matching * key, at which point it calls the iterator's <code>remove</code> method. * It returns the result of <code>getValue()</code> on the entry, if found, * or null if no entry is found. Note that maps which permit null values * may also return null if the key was removed. If the entrySet does not * support removal, this will also fail. This is O(n), so many * implementations override it for efficiency. * * @param key the key to remove * @return the value the key mapped to, or null if not present * @throws UnsupportedOperationException if deletion is unsupported * @see Iterator#remove() */ public Object remove(Object key) { Iterator entries = entrySet().iterator(); int pos = size(); while (--pos >= 0) { Map.Entry entry = (Map.Entry) entries.next(); if (equals(key, entry.getKey())) { // Must get the value before we remove it from iterator. Object r = entry.getValue(); entries.remove(); return r; } } return null; } /** * Returns the number of key-value mappings in the map. If there are more * than Integer.MAX_VALUE mappings, return Integer.MAX_VALUE. This is * implemented as <code>entrySet().size()</code>. * * @return the number of mappings * @see Set#size() */ public int size() { return entrySet().size(); } /** * Returns a String representation of this map. This is a listing of the * map entries (which are specified in Map.Entry as being * <code>getKey() + "=" + getValue()</code>), separated by a comma and * space (", "), and surrounded by braces ('{' and '}'). This implementation * uses a StringBuffer and iterates over the entrySet to build the String. * Note that this can fail with an exception if underlying keys or * values complete abruptly in toString(). * * @return a String representation * @see Map.Entry#toString() */ public String toString() { Iterator entries = entrySet().iterator(); StringBuffer r = new StringBuffer("{"); for (int pos = size(); pos > 0; pos--) { Map.Entry entry = (Map.Entry) entries.next(); r.append(entry.getKey()); r.append('='); r.append(entry.getValue()); if (pos > 1) r.append(", "); } r.append("}"); return r.toString(); } /** * Returns a collection or bag view of this map's values. The collection * is backed by the map, so changes in one show up in the other. * Modifications while an iteration is in progress produce undefined * behavior. The collection supports removal if entrySet() does, but * does not support element addition. * <p> * * This implementation creates an AbstractCollection, where the iterator * wraps the entrySet iterator, size defers to the Map's size, and contains * defers to the Map's containsValue. The collection is created on first * use, and returned on subsequent uses, although since no synchronization * occurs, there is a slight possibility of creating two collections. * * @return a Collection view of the values * @see Collection#iterator() * @see #size() * @see #containsValue(Object) * @see #keySet() */ public Collection values() { if (values == null) values = new AbstractCollection() { public int size() { return AbstractMap.this.size(); } public boolean contains(Object value) { return containsValue(value); } public Iterator iterator() { return new Iterator() { private final Iterator map_iterator = entrySet().iterator(); public boolean hasNext() { return map_iterator.hasNext(); } public Object next() { return ((Map.Entry) map_iterator.next()).getValue(); } public void remove() { map_iterator.remove(); } }; } }; return values; } /** * Compare two objects according to Collection semantics. * * @param o1 the first object * @param o2 the second object * @return o1 == null ? o2 == null : o1.equals(o2) */ // Package visible for use throughout java.util. // It may be inlined since it is final. static final boolean equals(Object o1, Object o2) { return o1 == null ? o2 == null : o1.equals(o2); } /** * Hash an object according to Collection semantics. * * @param o the object to hash * @return o1 == null ? 0 : o1.hashCode() */ // Package visible for use throughout java.util. // It may be inlined since it is final. static final int hashCode(Object o) { return o == null ? 0 : o.hashCode(); } /** * A class which implements Map.Entry. It is shared by HashMap, TreeMap, * Hashtable, and Collections. It is not specified by the JDK, but makes * life much easier. * * @author Jon Zeppieri * @author Eric Blake <ebb9@email.byu.edu> */ // XXX - FIXME Use fully qualified implements as gcj 3.1 workaround. static class BasicMapEntry implements Map.Entry { /** * The key. Package visible for direct manipulation. */ Object key; /** * The value. Package visible for direct manipulation. */ Object value; /** * Basic constructor initializes the fields. * @param newKey the key * @param newValue the value */ BasicMapEntry(Object newKey, Object newValue) { key = newKey; value = newValue; } /** * Compares the specified object with this entry. Returns true only if * the object is a mapping of identical key and value. In other words, * this must be:<br> * <pre>(o instanceof Map.Entry) * && (getKey() == null ? ((HashMap) o).getKey() == null * : getKey().equals(((HashMap) o).getKey())) * && (getValue() == null ? ((HashMap) o).getValue() == null * : getValue().equals(((HashMap) o).getValue()))</pre> * * @param o the object to compare * @return <code>true</code> if it is equal */ public final boolean equals(Object o) { if (! (o instanceof Map.Entry)) return false; // Optimize for our own entries. if (o instanceof BasicMapEntry) { BasicMapEntry e = (BasicMapEntry) o; return (AbstractMap.equals(key, e.key) && AbstractMap.equals(value, e.value)); } Map.Entry e = (Map.Entry) o; return (AbstractMap.equals(key, e.getKey()) && AbstractMap.equals(value, e.getValue())); } /** * Get the key corresponding to this entry. * * @return the key */ public final Object getKey() { return key; } /** * Get the value corresponding to this entry. If you already called * Iterator.remove(), the behavior undefined, but in this case it works. * * @return the value */ public final Object getValue() { return value; } /** * Returns the hash code of the entry. This is defined as the exclusive-or * of the hashcodes of the key and value (using 0 for null). In other * words, this must be:<br> * <pre>(getKey() == null ? 0 : getKey().hashCode()) * ^ (getValue() == null ? 0 : getValue().hashCode())</pre> * * @return the hash code */ public final int hashCode() { return (AbstractMap.hashCode(key) ^ AbstractMap.hashCode(value)); } /** * Replaces the value with the specified object. This writes through * to the map, unless you have already called Iterator.remove(). It * may be overridden to restrict a null value. * * @param newVal the new value to store * @return the old value * @throws NullPointerException if the map forbids null values */ public Object setValue(Object newVal) { Object r = value; value = newVal; return r; } /** * This provides a string representation of the entry. It is of the form * "key=value", where string concatenation is used on key and value. * * @return the string representation */ public final String toString() { return key + "=" + value; } } // class BasicMapEntry}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -