基于ConcurrentHashMap实现ConcurrentHashSet

xiaoxiao2021-02-28  62

我们知道,在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(); } }

转载请注明原文地址: https://www.6miu.com/read-63119.html

最新回复(0)