基于ConcurrentHashMap实现ConcurrentHashSet

来源:互联网 发布:gas mask mac 下载 编辑:程序博客网 时间:2024/06/16 04:48

我们知道,在Java中,HashMap是线程不安全的,ConcurrentHashMap并发优化的HashMap,而JDK并未提供ConcurrentHashSet。
但我们可以基于ConcurrentHashMap实现ConcurrentHashSet。

示例如下:

package hello;import java.util.Collection;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;/** * 基于ConcurrentHashMap实现ConcurrentHashSet * */public class ConcurrentHashSet<E> implements Set<E> {    private final Map<E, Object> map;    private static final Object OBJ = new Object();    public ConcurrentHashSet(int size) {        map = new ConcurrentHashMap<>(size);    }    public ConcurrentHashSet() {        map = new ConcurrentHashMap<>();    }    @Override    public int size() {        return map.size();    }    @Override    public boolean isEmpty() {        return map.isEmpty();    }    @Override    public boolean contains(Object o) {        return map.containsKey(o);    }    @Override    public Iterator<E> iterator() {        return map.keySet().iterator();    }    @Override    public Object[] toArray() {        return map.keySet().toArray();    }    @Override    public <T> T[] toArray(T[] a) {        return map.keySet().toArray(a);    }    @Override    public boolean add(E e) {        return map.put(e, OBJ) == null;    }    @Override    public boolean remove(Object o) {        return map.remove(o) == null;    }    @Override    public boolean containsAll(Collection<?> c) {        return map.keySet().containsAll(c);    }    @Override    public boolean addAll(Collection<? extends E> c) {        boolean changed = false;        for (E e : c) {            if (map.put(e, OBJ) == null) {                changed = true;            }        }        return changed;    }    @Override    public boolean retainAll(Collection<?> c) {        throw new UnsupportedOperationException();    }    @Override    public boolean removeAll(Collection<?> c) {        throw new UnsupportedOperationException();    }    @Override    public void clear() {        map.clear();    }}


原创粉丝点击