2012-11-23 8 views

答えて

6

おそらく実装を見て照明されるだろう:

private static class SetFromMap<E> extends AbstractSet<E> 
    implements Set<E>, Serializable 
{ 
    private final Map<E, Boolean> m; // The backing map 
    private transient Set<E> s;  // Its keySet 

    SetFromMap(Map<E, Boolean> 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<E> iterator()  { return s.iterator(); } 
    public Object[] toArray()   { return s.toArray(); } 
    public <T> 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 -> trueというエントリが追加されます。

public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; } 

だから、このクラスでは、あなたのMap単に物事がにマッピングされた値を無視して、単にキーを使用してSetように振る舞うオブジェクトになります。

+0

、 –

+0

私の主な質問は集合を支持しているいくつかの説明を追加してください、あなたはそれらとはどういう意味ですか。..マップ – Heggi

+0

Thanks @Christopher Martin ... – Heggi

0

セットは内部的にマップを使用して値を格納します。ここで、バッキング・マップは、セットによって内部的に使用されるセット・マップを参照します。 詳細については、簡単に言えば http://www.jusfortechies.com/java/core-java/inside-set.php

2

は私だけのためのサンプルコードを作ったあなた

HashMap<String, Boolean> map = new HashMap<String, Boolean>(); 

Set<String> set = Collections.newSetFromMap(map); 

System.out.println(set); 

for (int i = 0; i < 10; i++) 
    map.put("" + i, i % 2 == 0); 

System.out.println(map); 

System.out.println(set); 

と出力

[] 
{3=false, 2=true, 1=false, 0=true, 7=false, 6=true, 5=false, 4=true, 9=false, 8=true} 
[3, 2, 1, 0, 7, 6, 5, 4, 9, 8] 
+0

Javadocから:対応するSet実装(HashMapやTreeMapなど)を既に持っているMap実装でこのメソッドを使う必要はありません。 – Jasper

関連する問題