ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/AbstractMap.java
(Generate patch)

Comparing jsr166/src/main/java/util/AbstractMap.java (file contents):
Revision 1.13 by jsr166, Mon Jun 20 18:02:22 2005 UTC vs.
Revision 1.17 by jsr166, Sat Sep 10 20:15:50 2005 UTC

# Line 253 | Line 253 | public abstract class AbstractMap<K,V> i
253       * @throws IllegalArgumentException      {@inheritDoc}
254       */
255      public void putAll(Map<? extends K, ? extends V> m) {
256 <        Iterator<? extends Entry<? extends K, ? extends V>> i = m.entrySet().iterator();
257 <        while (i.hasNext()) {
258 <            Entry<? extends K, ? extends V> e = i.next();
259 <            put(e.getKey(), e.getValue());
260 <        }
256 >        for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
257 >            put(e.getKey(), e.getValue());
258      }
259  
260      /**
# Line 388 | Line 385 | public abstract class AbstractMap<K,V> i
385      // Comparison and hashing
386  
387      /**
388 <     * {@inheritDoc}
388 >     * Compares the specified object with this map for equality.  Returns
389 >     * <tt>true</tt> if the given object is also a map and the two maps
390 >     * represent the same mappings.  More formally, two maps <tt>m1</tt> and
391 >     * <tt>m2</tt> represent the same mappings if
392 >     * <tt>m1.entrySet().equals(m2.entrySet())</tt>.  This ensures that the
393 >     * <tt>equals</tt> method works properly across different implementations
394 >     * of the <tt>Map</tt> interface.
395       *
396       * <p>This implementation first checks if the specified object is this map;
397       * if so it returns <tt>true</tt>.  Then, it checks if the specified
# Line 398 | Line 401 | public abstract class AbstractMap<K,V> i
401       * contains each mapping that this map contains.  If the specified map
402       * fails to contain such a mapping, <tt>false</tt> is returned.  If the
403       * iteration completes, <tt>true</tt> is returned.
404 +     *
405 +     * @param o object to be compared for equality with this map
406 +     * @return <tt>true</tt> if the specified object is equal to this map
407       */
408      public boolean equals(Object o) {
409          if (o == this)
# Line 433 | Line 439 | public abstract class AbstractMap<K,V> i
439      }
440  
441      /**
442 <     * {@inheritDoc}
442 >     * Returns the hash code value for this map.  The hash code of a map is
443 >     * defined to be the sum of the hash codes of each entry in the map's
444 >     * <tt>entrySet()</tt> view.  This ensures that <tt>m1.equals(m2)</tt>
445 >     * implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps
446 >     * <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
447 >     * {@link Object#hashCode}.
448       *
449       * <p>This implementation iterates over <tt>entrySet()</tt>, calling
450 <     * <tt>hashCode()</tt> on each element (entry) in the set, and
451 <     * adding up the results.
450 >     * {@link Map.Entry#hashCode hashCode()} on each element (entry) in the
451 >     * set, and adding up the results.
452       *
453 +     * @return the hash code value for this map
454       * @see Map.Entry#hashCode()
443     * @see Object#hashCode()
455       * @see Object#equals(Object)
456       * @see Set#equals(Object)
457       */
# Line 460 | Line 471 | public abstract class AbstractMap<K,V> i
471       * <tt>", "</tt> (comma and space).  Each key-value mapping is rendered as
472       * the key followed by an equals sign (<tt>"="</tt>) followed by the
473       * associated value.  Keys and values are converted to strings as by
474 <     * <tt>String.valueOf(Object)</tt>.<p>
474 >     * {@link String#valueOf(Object)}.
475       *
476 <     * This implementation creates an empty string buffer, appends a left
466 <     * brace, and iterates over the map's <tt>entrySet</tt> view, appending
467 <     * the string representation of each <tt>map.entry</tt> in turn.  After
468 <     * appending each entry except the last, the string <tt>", "</tt> is
469 <     * appended.  Finally a right brace is appended.  A string is obtained
470 <     * from the stringbuffer, and returned.
471 <     *
472 <     * @return a String representation of this map
476 >     * @return a string representation of this map
477       */
478      public String toString() {
475        StringBuilder sb = new StringBuilder();
476        sb.append("{");
477
479          Iterator<Entry<K,V>> i = entrySet().iterator();
480 <        boolean hasNext = i.hasNext();
481 <        while (hasNext) {
480 >        if (! i.hasNext())
481 >            return "{}";
482 >
483 >        StringBuilder sb = new StringBuilder();
484 >        sb.append('{');
485 >        for (;;) {
486              Entry<K,V> e = i.next();
487              K key = e.getKey();
488 <            V value = e.getValue();
489 <            if (key == this)
490 <                sb.append("(this Map)");
491 <            else
492 <                sb.append(key);
493 <            sb.append("=");
494 <            if (value == this)
495 <                sb.append("(this Map)");
491 <            else
492 <                sb.append(value);
493 <            hasNext = i.hasNext();
494 <            if (hasNext)
495 <                sb.append(", ");
496 <        }
497 <
498 <        sb.append("}");
499 <        return sb.toString();
488 >            V value = e.getValue();
489 >            sb.append(key   == this ? "(this Map)" : key);
490 >            sb.append('=');
491 >            sb.append(value == this ? "(this Map)" : value);
492 >            if (! i.hasNext())
493 >                return sb.append('}').toString();
494 >            sb.append(", ");
495 >        }
496      }
497  
498      /**
# Line 517 | Line 513 | public abstract class AbstractMap<K,V> i
513       * Test for equality, checking for nulls.
514       */
515      private static boolean eq(Object o1, Object o2) {
516 <        return (o1 == null ? o2 == null : o1.equals(o2));
516 >        return o1 == null ? o2 == null : o1.equals(o2);
517      }
518  
519      // Implementation Note: SimpleEntry and SimpleImmutableEntry
# Line 534 | Line 530 | public abstract class AbstractMap<K,V> i
530       * facilitates the process of building custom map
531       * implementations. For example, it may be convenient to return
532       * arrays of <tt>SimpleEntry</tt> instances in method
533 <     * <tt>Map.entrySet().toArray</tt>
533 >     * <tt>Map.entrySet().toArray</tt>.
534 >     *
535 >     * @since 1.6
536       */
537 <    public static class SimpleEntry<K,V> implements Entry<K,V> {
537 >    public static class SimpleEntry<K,V>
538 >        implements Entry<K,V>, java.io.Serializable
539 >    {
540 >        private static final long serialVersionUID = -8499721149061103585L;
541 >
542          private final K key;
543          private V value;
544  
# Line 602 | Line 604 | public abstract class AbstractMap<K,V> i
604          }
605  
606          public int hashCode() {
607 <            return ((key   == null)   ? 0 :   key.hashCode()) ^
608 <                   ((value == null)   ? 0 : value.hashCode());
607 >            return (key   == null ? 0 :   key.hashCode()) ^
608 >                   (value == null ? 0 : value.hashCode());
609          }
610  
611          /**
# Line 621 | Line 623 | public abstract class AbstractMap<K,V> i
623      }
624  
625      /**
626 <     * An Entry maintaining an immutable key and value, This class
626 >     * An Entry maintaining an immutable key and value.  This class
627       * does not support method <tt>setValue</tt>.  This class may be
628       * convenient in methods that return thread-safe snapshots of
629       * key-value mappings.
630 +     *
631 +     * @since 1.6
632       */
633 <    public static class SimpleImmutableEntry<K,V> implements Entry<K,V> {
633 >    public static class SimpleImmutableEntry<K,V>
634 >        implements Entry<K,V>, java.io.Serializable
635 >    {
636 >        private static final long serialVersionUID = 7138329143949025153L;
637 >
638          private final K key;
639          private final V value;
640  
# Line 693 | Line 701 | public abstract class AbstractMap<K,V> i
701          }
702  
703          public int hashCode() {
704 <            return ((key   == null)   ? 0 :   key.hashCode()) ^
705 <                   ((value == null)   ? 0 : value.hashCode());
704 >            return (key   == null ? 0 :   key.hashCode()) ^
705 >                   (value == null ? 0 : value.hashCode());
706          }
707  
708          /**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines