// from gee.cs.oswego.edu/home/jsr166/jsr166 package jsr166tests.loops; /* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/licenses/publicdomain */ // A set wrapper over CHM for testing import java.util.*; import java.util.concurrent.*; import java.io.*; public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E>, Serializable { private final ConcurrentHashMap<E, Boolean> m; // The backing map private transient Set<E> keySet; // Its keySet public ConcurrentHashSet() { m = new ConcurrentHashMap<E, Boolean>(); keySet = m.keySet(); } public ConcurrentHashSet(int initialCapacity) { m = new ConcurrentHashMap<E, Boolean>(initialCapacity); keySet = m.keySet(); } public ConcurrentHashSet(int initialCapacity, float loadFactor, int concurrencyLevel) { m = new ConcurrentHashMap<E, Boolean>(initialCapacity, loadFactor, concurrencyLevel); keySet = m.keySet(); } public int size() { return m.size(); } public boolean isEmpty() { return m.isEmpty(); } public boolean contains(Object o) { return m.containsKey(o); } public Iterator<E> iterator() { return keySet.iterator(); } public Object[] toArray() { return keySet.toArray(); } public <T> T[] toArray(T[] a) { return keySet.toArray(a); } public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; } public boolean remove(Object o) { return m.remove(o) != null; } public boolean removeAll(Collection<?> c) { return keySet.removeAll(c); } public boolean retainAll(Collection<?> c) { return keySet.retainAll(c); } public void clear() { m.clear(); } public boolean equals(Object o) { return keySet.equals(o); } public int hashCode() { return keySet.hashCode(); } private static final long serialVersionUID = 2454657854757543876L; private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); keySet = m.keySet(); } }