2012-11-23 24 views
7

我想在JDK 1.5中使用這樣的「Collections.newSetFromMap()」方法,它不支持它。 Java 5中不支持ConcurrentHashSet類。 必須在JDK 1.5中編譯以下代碼行。我該怎麼做?用於JDK 1.5中的Collections.newSetFromMap的替代方法?

protected Set<String> knownLCWords = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>()); 

請指導我。

+0

查看JDK6中該方法的實現,並自己重新實現。這只是幾行代碼。 –

+0

謝謝JBNizet。 :) – user1847393

回答

3

下面是從Java Collections source執行該方法。本質上,該方法返回AbstractSet的子類,其中包含Map以及一個瞬態Set

/** 
* Returns a set backed by the specified map. The resulting set displays 
* the same ordering, concurrency, and performance characteristics as the 
* backing map. In essence, this factory method provides a {@link Set} 
* implementation corresponding to any {@link Map} implementation. There 
* is no need to use this method on a {@link Map} implementation that 
* already has a corresponding {@link Set} implementation (such as {@link 
* HashMap} or {@link TreeMap}). 
* 
* <p>Each method invocation on the set returned by this method results in 
* exactly one method invocation on the backing map or its <tt>keySet</tt> 
* view, with one exception. The <tt>addAll</tt> method is implemented 
* as a sequence of <tt>put</tt> invocations on the backing map. 
* 
* <p>The specified map must be empty at the time this method is invoked, 
* and should not be accessed directly after this method returns. These 
* conditions are ensured if the map is created empty, passed directly 
* to this method, and no reference to the map is retained, as illustrated 
* in the following code fragment: 
* <pre> 
* Set&lt;Object&gt; weakHashSet = Collections.newSetFromMap(
*  new WeakHashMap&lt;Object, Boolean&gt;()); 
* </pre> 
* 
* @param map the backing map 
* @return the set backed by the map 
* @throws IllegalArgumentException if <tt>map</tt> is not empty 
* @since 1.6 
*/ 
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) { 
    return new SetFromMap<E>(map); 
} 

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(); 
    } 
} 
+0

它工作。謝謝:) – user1847393

相關問題