1 package org.eclipse.jetty.util; 2 3 import java.util.AbstractSet; 4 import java.util.Collection; 5 import java.util.Iterator; 6 import java.util.Map; 7 import java.util.Set; 8 import java.util.concurrent.ConcurrentHashMap; 9 10 public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E> 11 { 12 private final Map<E, Boolean> _map = new ConcurrentHashMap<E, Boolean>(); 13 private transient Set<E> _keys = _map.keySet(); 14 15 public ConcurrentHashSet() 16 { 17 } 18 19 @Override 20 public boolean add(E e) 21 { 22 return _map.put(e,Boolean.TRUE) == null; 23 } 24 25 @Override 26 public void clear() 27 { 28 _map.clear(); 29 } 30 31 @Override 32 public boolean contains(Object o) 33 { 34 return _map.containsKey(o); 35 } 36 37 @Override 38 public boolean containsAll(Collection<?> c) 39 { 40 return _keys.containsAll(c); 41 } 42 43 @Override 44 public boolean equals(Object o) 45 { 46 return o == this || _keys.equals(o); 47 } 48 49 @Override 50 public int hashCode() 51 { 52 return _keys.hashCode(); 53 } 54 55 @Override 56 public boolean isEmpty() 57 { 58 return _map.isEmpty(); 59 } 60 61 @Override 62 public Iterator<E> iterator() 63 { 64 return _keys.iterator(); 65 } 66 67 @Override 68 public boolean remove(Object o) 69 { 70 return _map.remove(o) != null; 71 } 72 73 @Override 74 public boolean removeAll(Collection<?> c) 75 { 76 return _keys.removeAll(c); 77 } 78 79 @Override 80 public boolean retainAll(Collection<?> c) 81 { 82 return _keys.retainAll(c); 83 } 84 85 @Override 86 public int size() 87 { 88 return _map.size(); 89 } 90 91 @Override 92 public Object[] toArray() 93 { 94 return _keys.toArray(); 95 } 96 97 @Override 98 public <T> T[] toArray(T[] a) 99 { 100 return _keys.toArray(a); 101 } 102 103 @Override 104 public String toString() 105 { 106 return _keys.toString(); 107 } 108 }