diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index a06b98ac5d7750f524dfe64813cb3b2765defc73..6e7ea5d7548b9af319701a6154c034a77552bb01 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+2002-04-07  Mark Wielaard <mark@klomp.org>
+
+        * java/util/AbstractMap.java (putAll): Use entrySet size.
+        (toString): Explicitly use getKey() and getValue().
+
 2002-04-07  Mark Wielaard <mark@klomp.org>
 
 	* java/util/Hashtable.java (contains): Remove NullPointer check.
diff --git a/libjava/java/util/AbstractMap.java b/libjava/java/util/AbstractMap.java
index 393d3c7754dac41a0cae277340851b8809f89b28..555d055394d2410b30fe20accf87451abe9fa17d 100644
--- a/libjava/java/util/AbstractMap.java
+++ b/libjava/java/util/AbstractMap.java
@@ -353,7 +353,7 @@ public abstract class AbstractMap implements Map
   public void putAll(Map m)
   {
     Iterator entries = m.entrySet().iterator();
-    int pos = size();
+    int pos = m.size();
     while (--pos >= 0)
       {
         Map.Entry entry = (Map.Entry) entries.next();
@@ -425,10 +425,10 @@ public abstract class AbstractMap implements Map
     StringBuffer r = new StringBuffer("{");
     for (int pos = size(); pos > 0; pos--)
       {
-        // Append the toString value of the entries rather than calling
-        // getKey/getValue. This is more efficient and it matches the JDK
-        // behaviour.
-        r.append(entries.next());
+        Map.Entry entry = (Map.Entry) entries.next();
+        r.append(entry.getKey());
+        r.append('=');
+        r.append(entry.getValue());
         if (pos > 1)
           r.append(", ");
       }