You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/03/13 14:00:12 UTC

svn commit: r385537 - in /incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util: HashMap.java HashSet.java LinkedHashMap.java

Author: tellison
Date: Mon Mar 13 05:00:08 2006
New Revision: 385537

URL: http://svn.apache.org/viewcvs?rev=385537&view=rev
Log:
Fixes to HashMap:
 - rename HashMapEntry to Entry 
 - represent load factor as a float
 - declare invariant fields as final 
 - update serialization to reflect modifications

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashMap.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashSet.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/LinkedHashMap.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashMap.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashMap.java?rev=385537&r1=385536&r2=385537&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashMap.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashMap.java Mon Mar 13 05:00:08 2006
@@ -15,17 +15,14 @@
 
 package java.util;
 
-
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.io.ObjectStreamField;
 import java.io.Serializable;
 
 /**
  * HashMap is an implementation of Map. All optional operations are supported,
  * adding and removing. Keys and values can be any objects.
- * 
  */
 public class HashMap extends AbstractMap implements Map, Cloneable,
 		Serializable {
@@ -33,9 +30,9 @@
 
 	transient int elementCount;
 
-	transient HashMapEntry[] elementData;
+	transient Entry[] elementData;
 
-	int loadFactor;
+	final float loadFactor;
 
 	int threshold;
 
@@ -43,17 +40,17 @@
 
 	private static final int DEFAULT_SIZE = 16;
 
-	static class HashMapEntry extends MapEntry {
-		HashMapEntry next;
+	static class Entry extends MapEntry {
+		Entry next;
 
-		HashMapEntry(Object theKey, Object theValue) {
+		Entry(Object theKey, Object theValue) {
 			super(theKey, theValue);
 		}
 
 		public Object clone() {
-			HashMapEntry entry = (HashMapEntry) super.clone();
+			Entry entry = (Entry) super.clone();
 			if (next != null)
-				entry.next = (HashMapEntry) next.clone();
+				entry.next = (Entry) next.clone();
 			return entry;
 		}
 
@@ -67,15 +64,15 @@
 
 		int expectedModCount;
 
-		MapEntry.Type type;
+		final MapEntry.Type type;
 
 		boolean canRemove = false;
 
-		HashMapEntry entry;
+		Entry entry;
 
-		HashMapEntry lastEntry;
+		Entry lastEntry;
 
-		HashMap associatedMap;
+		final HashMap associatedMap;
 
 		HashMapIterator(MapEntry.Type value, HashMap hm) {
 			associatedMap = hm;
@@ -105,7 +102,7 @@
 			if (!hasNext())
 				throw new NoSuchElementException();
 
-			HashMapEntry result;
+			Entry result;
 			if (entry == null) {
 				result = lastEntry = associatedMap.elementData[position++];
 				entry = lastEntry.next;
@@ -139,7 +136,7 @@
 	}
 
 	static class HashMapEntrySet extends AbstractSet {
-		private HashMap associatedMap;
+		private final HashMap associatedMap;
 
 		public HashMapEntrySet(HashMap hm) {
 			associatedMap = hm;
@@ -167,8 +164,8 @@
 
 		public boolean contains(Object object) {
 			if (object instanceof Map.Entry) {
-				HashMapEntry entry = associatedMap
-						.getEntry(((Map.Entry) object).getKey());
+				Entry entry = associatedMap.getEntry(((Map.Entry) object)
+						.getKey());
 				return object.equals(entry);
 			}
 			return false;
@@ -189,8 +186,8 @@
 	 * @param s
 	 * @return Reference to the element array
 	 */
-	HashMapEntry[] newElementArray(int s) {
-		return new HashMapEntry[s];
+	Entry[] newElementArray(int s) {
+		return new Entry[s];
 	}
 
 	/**
@@ -214,7 +211,7 @@
 		if (capacity >= 0) {
 			elementCount = 0;
 			elementData = newElementArray(capacity == 0 ? 1 : capacity);
-			loadFactor = 7500; // Default load factor of 0.75
+			loadFactor = 0.75f; // Default load factor of 0.75
 			computeMaxSize();
 		} else
 			throw new IllegalArgumentException();
@@ -238,7 +235,7 @@
 		if (capacity >= 0 && loadFactor > 0) {
 			elementCount = 0;
 			elementData = newElementArray(capacity == 0 ? 1 : capacity);
-			this.loadFactor = (int) (loadFactor * 10000);
+			this.loadFactor = loadFactor;
 			computeMaxSize();
 		} else
 			throw new IllegalArgumentException();
@@ -281,10 +278,10 @@
 		try {
 			HashMap map = (HashMap) super.clone();
 			map.elementData = newElementArray(elementData.length);
-			HashMapEntry entry;
+			Entry entry;
 			for (int i = 0; i < elementData.length; i++) {
 				if ((entry = elementData[i]) != null)
-					map.elementData[i] = (HashMapEntry) entry.clone();
+					map.elementData[i] = (Entry) entry.clone();
 			}
 			return map;
 		} catch (CloneNotSupportedException e) {
@@ -293,7 +290,7 @@
 	}
 
 	private void computeMaxSize() {
-		threshold = (int) ((long) elementData.length * loadFactor / 10000);
+		threshold = (int) (elementData.length * loadFactor);
 	}
 
 	/**
@@ -333,7 +330,7 @@
 	public boolean containsValue(Object value) {
 		if (value != null) {
 			for (int i = elementData.length; --i >= 0;) {
-				HashMapEntry entry = elementData[i];
+				Entry entry = elementData[i];
 				while (entry != null) {
 					if (value.equals(entry.value))
 						return true;
@@ -342,7 +339,7 @@
 			}
 		} else {
 			for (int i = elementData.length; --i >= 0;) {
-				HashMapEntry entry = elementData[i];
+				Entry entry = elementData[i];
 				while (entry != null) {
 					if (entry.value == null)
 						return true;
@@ -372,14 +369,14 @@
 	 * @return the value of the mapping with the specified key
 	 */
 	public Object get(Object key) {
-		HashMapEntry m = getEntry(key);
+		Entry m = getEntry(key);
 		if (m != null) {
 			return m.value;
 		}
 		return null;
 	}
 
-	HashMapEntry getEntry(Object key) {
+	Entry getEntry(Object key) {
 		int index = getModuloHash(key);
 		return findEntry(key, index);
 	}
@@ -390,8 +387,8 @@
 		return (key.hashCode() & 0x7FFFFFFF) % elementData.length;
 	}
 
-	HashMapEntry findEntry(Object key, int index) {
-		HashMapEntry m;
+	Entry findEntry(Object key, int index) {
+		Entry m;
 		m = elementData[index];
 		if (key != null) {
 			while (m != null && !keysEqual(key, m.key))
@@ -468,7 +465,7 @@
 	 */
 	public Object put(Object key, Object value) {
 		int index = getModuloHash(key);
-		HashMapEntry entry = findEntry(key, index);
+		Entry entry = findEntry(key, index);
 
 		if (entry == null) {
 			modCount++;
@@ -484,8 +481,8 @@
 		return result;
 	}
 
-	HashMapEntry createEntry(Object key, int index, Object value) {
-		HashMapEntry entry = new HashMapEntry(key, value);
+	Entry createEntry(Object key, int index, Object value) {
+		Entry entry = new Entry(key, value);
 		entry.next = elementData[index];
 		elementData[index] = entry;
 		return entry;
@@ -505,14 +502,14 @@
 		int length = elementData.length << 1;
 		if (length == 0)
 			length = 1;
-		HashMapEntry[] newData = newElementArray(length);
+		Entry[] newData = newElementArray(length);
 		for (int i = 0; i < elementData.length; i++) {
-			HashMapEntry entry = elementData[i];
+			Entry entry = elementData[i];
 			while (entry != null) {
 				Object key = entry.key;
 				int index = key == null ? 0 : (key.hashCode() & 0x7FFFFFFF)
 						% length;
-				HashMapEntry next = entry.next;
+				Entry next = entry.next;
 				entry.next = newData[index];
 				newData[index] = entry;
 				entry = next;
@@ -531,17 +528,17 @@
 	 *         this HashMap
 	 */
 	public Object remove(Object key) {
-		HashMapEntry entry = removeEntry(key);
+		Entry entry = removeEntry(key);
 		if (entry != null) {
 			return entry.value;
 		}
 		return null;
 	}
 
-	HashMapEntry removeEntry(Object key) {
+	Entry removeEntry(Object key) {
 		int index = 0;
-		HashMapEntry entry;
-		HashMapEntry last = null;
+		Entry entry;
+		Entry last = null;
 		if (key != null) {
 			index = (key.hashCode() & 0x7FFFFFFF) % elementData.length;
 			entry = elementData[index];
@@ -610,20 +607,13 @@
 		return valuesCollection;
 	}
 
-	private static final ObjectStreamField[] serialPersistentFields = {
-			new ObjectStreamField("loadFactor", Float.TYPE),
-			new ObjectStreamField("threshold", Integer.TYPE) };
-
 	private void writeObject(ObjectOutputStream stream) throws IOException {
-		ObjectOutputStream.PutField fields = stream.putFields();
-		fields.put("loadFactor", (float) loadFactor / 10000);
-		fields.put("threshold", threshold);
-		stream.writeFields();
+		stream.defaultWriteObject();
 		stream.writeInt(elementData.length);
 		stream.writeInt(elementCount);
 		Iterator iterator = entrySet().iterator();
 		while (iterator.hasNext()) {
-			HashMapEntry entry = (HashMapEntry) iterator.next();
+			Entry entry = (Entry) iterator.next();
 			stream.writeObject(entry.key);
 			stream.writeObject(entry.value);
 			entry = entry.next;
@@ -632,11 +622,9 @@
 
 	private void readObject(ObjectInputStream stream) throws IOException,
 			ClassNotFoundException {
-		ObjectInputStream.GetField fields = stream.readFields();
-		loadFactor = (int) (fields.get("loadFactor", 0.75f) * 10000);
-		threshold = fields.get("threshold", 0);
+		stream.defaultReadObject();
 		int length = stream.readInt();
-		elementData = new HashMapEntry[length];
+		elementData = new Entry[length];
 		elementCount = stream.readInt();
 		for (int i = elementCount; --i >= 0;) {
 			Object key = stream.readObject();

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashSet.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashSet.java?rev=385537&r1=385536&r2=385537&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashSet.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/HashSet.java Mon Mar 13 05:00:08 2006
@@ -176,10 +176,10 @@
 	private void writeObject(ObjectOutputStream stream) throws IOException {
 		stream.defaultWriteObject();
 		stream.writeInt(backingMap.elementData.length);
-		stream.writeFloat((float) backingMap.loadFactor / 10000);
+		stream.writeFloat(backingMap.loadFactor);
 		stream.writeInt(backingMap.elementCount);
 		for (int i = backingMap.elementData.length; --i >= 0;) {
-			HashMap.HashMapEntry entry = backingMap.elementData[i];
+			HashMap.Entry entry = backingMap.elementData[i];
 			while (entry != null) {
 				stream.writeObject(entry.key);
 				entry = entry.next;

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/LinkedHashMap.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/LinkedHashMap.java?rev=385537&r1=385536&r2=385537&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/LinkedHashMap.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/LinkedHashMap.java Mon Mar 13 05:00:08 2006
@@ -17,14 +17,22 @@
 
 
 /**
- * LinkedHashMap
- * 
+ * LinkedHashMap is a variant on HashMap. Its entries are kept in a doubly-linked list.
+ * The iteration order is, by default, the order in which keys were inserted.
+ * <p> 
+ * If the three arg constructor is used, and <code>order</code> is specified as <code>true</code>, 
+ * the iteration would be in the order that entries were accessed. The access order gets 
+ * affected by put(), get(), putAll() operations, but not by operations on the collection views.
+ * <p>
+ * Null elements are allowed, and all the optional Map operations are supported.
+ * <p>
+ *
  */
 public class LinkedHashMap extends HashMap {
 	
 	private static final long serialVersionUID = 3801124242820219131L;
 
-	private boolean accessOrder;
+	private final boolean accessOrder;
 
 	transient private LinkedHashMapEntry head, tail;
 
@@ -173,7 +181,7 @@
 		}
 	}
 
-	static final class LinkedHashMapEntry extends HashMapEntry {
+	static final class LinkedHashMapEntry extends Entry {
 		LinkedHashMapEntry chainForward, chainBackward;
 
 		LinkedHashMapEntry(Object theKey, Object theValue) {
@@ -199,7 +207,7 @@
 	 * @param s
 	 * @return Reference to the element array
 	 */
-	HashMapEntry[] newElementArray(int s) {
+	Entry[] newElementArray(int s) {
 		return new LinkedHashMapEntry[s];
 	}
 
@@ -233,9 +241,9 @@
 	/*
 	 * @param key
 	 * @param index
-	 * @return
+	 * @return Entry
 	 */
-	HashMapEntry createEntry(Object key, int index, Object value) {
+	Entry createEntry(Object key, int index, Object value) {
 		LinkedHashMapEntry m = new LinkedHashMapEntry(key, value);
 		m.next = elementData[index];
 		elementData[index] = m;