Refactor Map, Set implementations.

- Implement LinkedHashMap.EntrySet.remove method
- Implement clear and remove methods for
  AbstractMap's keySet() and values()
- Remove initialization block in LinkedHashMap
- Ignore capacity and loadFactor parameters in
  LinkedHashSet
- Remove toArray method in Collections.SetFromMap

Change-Id: Ie590954cb37356269489be385c14379313934df7
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractMap.java b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
index c9f838e..eae9667 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -160,27 +160,35 @@
     return size() == 0;
   }
 
+  @Override
   public Set<K> keySet() {
-    final Set<Entry<K, V>> entrySet = entrySet();
     return new AbstractSet<K>() {
       @Override
+      public void clear() {
+        AbstractMap.this.clear();
+      }
+
+      @Override
       public boolean contains(Object key) {
         return containsKey(key);
       }
 
       @Override
       public Iterator<K> iterator() {
-        final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+        final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
         return new Iterator<K>() {
+          @Override
           public boolean hasNext() {
             return outerIter.hasNext();
           }
 
+          @Override
           public K next() {
-            Map.Entry<K, V> entry = outerIter.next();
+            Entry<K, V> entry = outerIter.next();
             return entry.getKey();
           }
 
+          @Override
           public void remove() {
             outerIter.remove();
           }
@@ -188,8 +196,17 @@
       }
 
       @Override
+      public boolean remove(Object key) {
+        if (containsKey(key)) {
+          AbstractMap.this.remove(key);
+          return true;
+        }
+        return false;
+      }
+
+      @Override
       public int size() {
-        return entrySet.size();
+        return AbstractMap.this.size();
       }
     };
   }
@@ -233,27 +250,35 @@
     return s + "}";
   }
 
+  @Override
   public Collection<V> values() {
-    final Set<Entry<K, V>> entrySet = entrySet();
     return new AbstractCollection<V>() {
       @Override
+      public void clear() {
+        AbstractMap.this.clear();
+      }
+
+      @Override
       public boolean contains(Object value) {
         return containsValue(value);
       }
 
       @Override
       public Iterator<V> iterator() {
-        final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+        final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
         return new Iterator<V>() {
+          @Override
           public boolean hasNext() {
             return outerIter.hasNext();
           }
 
+          @Override
           public V next() {
-            V value = outerIter.next().getValue();
-            return value;
+            Entry<K, V> entry = outerIter.next();
+            return entry.getValue();
           }
 
+          @Override
           public void remove() {
             outerIter.remove();
           }
@@ -262,7 +287,7 @@
 
       @Override
       public int size() {
-        return entrySet.size();
+        return AbstractMap.this.size();
       }
     };
   }
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractSet.java b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
index dc30516..cfc81b4 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractSet.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
@@ -36,18 +36,10 @@
     }
 
     Set<?> other = (Set<?>) o;
-
     if (other.size() != size()) {
       return false;
     }
-
-    for (Iterator<?> iter = other.iterator(); iter.hasNext();) {
-      Object otherItem = iter.next();
-      if (!contains(otherItem)) {
-        return false;
-      }
-    }
-    return true;
+    return containsAll(other);
   }
 
   @Override
diff --git a/user/super/com/google/gwt/emul/java/util/Collections.java b/user/super/com/google/gwt/emul/java/util/Collections.java
index 88f474c..d0aeddd 100644
--- a/user/super/com/google/gwt/emul/java/util/Collections.java
+++ b/user/super/com/google/gwt/emul/java/util/Collections.java
@@ -253,11 +253,6 @@
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
-      return keySet().toArray(a);
-    }
-
-    @Override
     public String toString() {
       return keySet().toString();
     }
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
index 51a7e5a..6b7f958 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
@@ -51,7 +51,6 @@
 
     public ChainEntry(K key, V value) {
       super(key, value);
-      next = prev = null;
     }
 
     /**
@@ -147,8 +146,18 @@
     }
 
     @Override
+    public boolean remove(Object entry) {
+      if (contains(entry)) {
+        Object key = ((Map.Entry<?, ?>) entry).getKey();
+        LinkedHashMap.this.remove(key);
+        return true;
+      }
+      return false;
+    }
+
+    @Override
     public int size() {
-      return map.size();
+      return LinkedHashMap.this.size();
     }
   }
 
@@ -172,35 +181,37 @@
    */
   private final transient HashMap<K, ChainEntry> map = new HashMap<K, ChainEntry>();
 
-  {
-    // Initialize the empty linked list.
-    head.prev = head;
-    head.next = head;
-  }
-
   public LinkedHashMap() {
+    resetChainEntries();
   }
 
   public LinkedHashMap(int ignored) {
-    super(ignored);
+    this(ignored, 0);
   }
 
   public LinkedHashMap(int ignored, float alsoIgnored) {
     super(ignored, alsoIgnored);
+    resetChainEntries();
   }
 
   public LinkedHashMap(int ignored, float alsoIgnored, boolean accessOrder) {
     super(ignored, alsoIgnored);
     this.accessOrder = accessOrder;
+    resetChainEntries();
   }
 
   public LinkedHashMap(Map<? extends K, ? extends V> toBeCopied) {
+    resetChainEntries();
     this.putAll(toBeCopied);
   }
 
   @Override
   public void clear() {
     map.clear();
+    resetChainEntries();
+  }
+
+  private void resetChainEntries() {
     head.prev = head;
     head.next = head;
   }
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
index cadb6a0..52a0b63 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
@@ -26,30 +26,20 @@
 public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable {
 
   public LinkedHashSet() {
-    super(new LinkedHashMap<E, Object>(16, .75f));
+    super(new LinkedHashMap<E, Object>());
   }
 
-  /**
-   * @param c
-   */
   public LinkedHashSet(Collection<? extends E> c) {
-    super(new LinkedHashMap<E, Object>(16, .75f));
+    super(new LinkedHashMap<E, Object>());
     addAll(c);
   }
 
-  /**
-   * @param initialCapacity
-   */
-  public LinkedHashSet(int initialCapacity) {
-    super(new LinkedHashMap<E, Object>(initialCapacity, .75f));
+  public LinkedHashSet(int ignored) {
+    super(new LinkedHashMap<E, Object>(ignored));
   }
 
-  /**
-   * @param initialCapacity
-   * @param loadFactor
-   */
-  public LinkedHashSet(int initialCapacity, float loadFactor) {
-    super(new LinkedHashMap<E, Object>(initialCapacity, loadFactor));
+  public LinkedHashSet(int ignored, float alsoIgnored) {
+    super(new LinkedHashMap<E, Object>(ignored, alsoIgnored));
   }
 
   @Override