看看实施可能会很有启发性:
private static class SetFromMap extends AbstractSet
implements Set, Serializable
{
private final Map m; // The backing map
private transient Set s; // Its keySet
SetFromMap(Map map) {
if (!map.isEmpty())
throw new IllegalArgumentException("Map is non-empty");
m = map;
s = map.keySet();
}
public void clear() { m.clear(); }
public int size() { return m.size(); }
public boolean isEmpty() { return m.isEmpty(); }
public boolean contains(Object o) { return m.containsKey(o); }
public boolean remove(Object o) { return m.remove(o) != null; }
public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
public Iterator iterator() { return s.iterator(); }
public Object[] toArray() { return s.toArray(); }
public T[] toArray(T[] a) { return s.toArray(a); }
public String toString() { return s.toString(); }
public int hashCode() { return s.hashCode(); }
public boolean equals(Object o) { return o == this || s.equals(o); }
public boolean containsAll(Collection> c) {return s.containsAll(c);}
public boolean removeAll(Collection> c) {return s.removeAll(c);}
public boolean retainAll(Collection> c) {return s.retainAll(c);}
// addAll is the only inherited implementation
private static final long serialVersionUID = 2454657854757543876L;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException
{
stream.defaultReadObject();
s = m.keySet();
}
}
编辑 – 添加说明:
您提供的地图用作此对象中的m字段.
当您向集合中添加元素e时,它会添加一个条目e – >对地图真实.
public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
因此,通过简单地忽略事物映射到的值,并使用键,此类将您的Map转换为行为类似于Set的对象.