7

Collectionsクラスにメソッドがあります。

Set<E> Collections.newSetFromMap(<backing map>)

バッキングマップとマップに裏打ちされたセットとはどういう意味ですか?

4

4 に答える 4

8

おそらく、実装を見るとわかりやすくなります。

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

于 2012-11-23T07:23:10.123 に答える
5

サンプルコードを作成しました

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]
于 2012-11-23T07:55:05.840 に答える
4

簡単に言えば、Collections.newSetFromMapは、提供された実装を使用して要素Map<E>を格納します。Set<E>

于 2012-11-23T07:42:28.250 に答える
0

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

于 2012-11-23T07:36:32.033 に答える