aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/HashSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/HashSet.java')
-rw-r--r--libjava/java/util/HashSet.java221
1 files changed, 221 insertions, 0 deletions
diff --git a/libjava/java/util/HashSet.java b/libjava/java/util/HashSet.java
new file mode 100644
index 0000000..f7cb326
--- /dev/null
+++ b/libjava/java/util/HashSet.java
@@ -0,0 +1,221 @@
+/* HashSet.java -- a class providing a HashMap-backet Set
+ Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+
+package java.util;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * This class provides a HashMap-backed implementation of the
+ * Set interface.
+ *
+ * Each element in the Set is a key in the backing HashMap; each key
+ * maps to a static token, denoting that the key does, in fact, exist.
+ *
+ * Most operations are O(1), assuming no hash collisions. In the worst
+ * case (where all hases collide), operations are O(n).
+ *
+ * HashSet is a part of the JDK1.2 Collections API.
+ *
+ * @author Jon Zeppieri
+ * @version $Revision: 1.5 $
+ * @modified $Id: HashSet.java,v 1.5 2000/10/26 10:19:00 bryce Exp $
+ */
+public class HashSet extends AbstractSet
+ implements Set, Cloneable, Serializable
+{
+ /** the HashMap which backs this Set */
+ transient HashMap map;
+ static final long serialVersionUID = -5024744406713321676L;
+
+ /**
+ * construct a new, empty HashSet whose backing HashMap has the default
+ * capacity and loadFacor
+ */
+ public HashSet()
+ {
+ map = new HashMap();
+ }
+
+ /**
+ * construct a new, empty HashSet whose backing HashMap has the supplied
+ * capacity and the default load factor
+ *
+ * @param initialCapacity the initial capacity of the backing
+ * HashMap
+ */
+ public HashSet(int initialCapacity)
+ {
+ map = new HashMap(initialCapacity);
+ }
+
+ /**
+ * construct a new, empty HashSet whose backing HashMap has the supplied
+ * capacity and load factor
+ *
+ * @param initialCapacity the initial capacity of the backing
+ * HashMap
+ * @param loadFactor the load factor of the backing HashMap
+ */
+ public HashSet(int initialCapacity, float loadFactor)
+ {
+ map = new HashMap(initialCapacity, loadFactor);
+ }
+
+ /**
+ * construct a new HashSet with the same elements as are in the supplied
+ * collection (eliminating any duplicates, of course; the backing HashMap
+ * will have the default capacity and load factor
+ *
+ * @param c a collection containing the elements with
+ * which this set will be initialized
+ */
+ public HashSet(Collection c)
+ {
+ map = new HashMap();
+ addAll(c);
+ }
+
+ /**
+ * adds the given Object to the set if it is not already in the Set,
+ * returns true if teh element was added, false otherwise
+ *
+ * @param o the Object to add to this Set
+ */
+ public boolean add(Object o)
+ {
+ return (map.put(o, Boolean.TRUE) == null);
+ }
+
+ /**
+ * empties this Set of all elements; this is a fast operation [O(1)]
+ */
+ public void clear()
+ {
+ map.clear();
+ }
+
+ /**
+ * returns a shallow copy of this Set (the Set itself is cloned; its
+ * elements are not)
+ */
+ public Object clone()
+ {
+ HashSet copy = null;
+ try
+ {
+ copy = (HashSet) super.clone();
+ copy.map = (HashMap) map.clone();
+ }
+ catch (CloneNotSupportedException ex)
+ {
+ }
+
+ return copy;
+ }
+
+ /**
+ * returns true if the supplied element is in this Set, false otherwise
+ *
+ * @param o the Object whose presence in this Set we are testing for
+ */
+ public boolean contains(Object o)
+ {
+ return map.containsKey(o);
+ }
+
+ /**
+ * returns true if this set has no elements in it (size() == 0)
+ */
+ public boolean isEmpty()
+ {
+ return map.isEmpty();
+ }
+
+ /**
+ * returns an Iterator over the elements of this Set; the Iterator allows
+ * removal of elements
+ */
+ public Iterator iterator()
+ {
+ return map.keySet().iterator();
+ }
+
+ /**
+ * removes the supplied Object from this Set if it is in the Set; returns
+ * true if an element was removed, false otherwise
+ */
+ public boolean remove(Object o)
+ {
+ return (map.remove(o) != null);
+ }
+
+ /**
+ * returns the number of elements in this Set
+ */
+ public int size()
+ {
+ return map.size();
+ }
+
+ /** Serialize this Object in a manner which is binary-compatible with the
+ * JDK */
+ private void writeObject(ObjectOutputStream s) throws IOException
+ {
+ Iterator it = iterator();
+ s.writeInt(map.buckets.length);
+ s.writeFloat(map.loadFactor);
+ s.writeInt(map.size);
+ while (it.hasNext())
+ s.writeObject(it.next());
+ }
+
+ /** Deserialize this Object in a manner which is binary-compatible with
+ * the JDK */
+ private void readObject(ObjectInputStream s) throws IOException,
+ ClassNotFoundException
+ {
+ int i, size, capacity;
+ float loadFactor;
+ Object element;
+
+ capacity = s.readInt();
+ loadFactor = s.readFloat();
+ size = s.readInt();
+
+ map = new HashMap(capacity, loadFactor);
+
+ for (i = 0; i < size; i++)
+ {
+ element = s.readObject();
+ map.put(element, Boolean.TRUE);
+ }
+ }
+}