Concurrent set : Set « Collections « Java Tutorial






/*
 * Copyright Ben Meadowcroft 2006
 * Version: $Revision: 1.1 $
 * Date:    $Date: 2006/02/24 22:24:46 $
 */
//com.agnotion.util.concurrent;

import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Ben Meadowcroft
 */
public class ConcurrentSet<Q> implements Set<Q>
{
  /** Piggy back off a concurrent hash map to get "weekly consistent" iterators etc */
  private ConcurrentHashMap<Q, Object> map = new ConcurrentHashMap<Q, Object>();

  /**
   * 
   */
  public ConcurrentSet() {
    this.map = new ConcurrentHashMap<Q, Object>();
  }

  /* (non-Javadoc)
   * @see java.util.Set#add(E)
   */
  public boolean add(Q item) {
    boolean containsObj = map.containsKey(item);
    if (containsObj == false)
    {
      /* ConcurrentHashMap doesn't allow null keys or values so we simply 
       * use the item added to the collection as the key and the Boolean 
       * TRUE object as the value. */
      map.put(item, Boolean.TRUE);
    }
    return !containsObj;
  }

  /* (non-Javadoc)
   * @see java.util.Set#addAll(java.util.Collection)
   */
  public boolean addAll(Collection<? extends Q> items) {
    boolean changed = false;
    for (Q item : items)
    {
      /* update flag determining whether set has changed or not */
      changed = add(item) || changed;
    }
    return changed;
  }

  /* (non-Javadoc)
   * @see java.util.Set#clear()
   */
  public void clear() {
    map.clear();
  }

  /* (non-Javadoc)
   * @see java.util.Set#contains(java.lang.Object)
   */
  public boolean contains(Object item) {
    return map.containsKey(item);
  }

  /* (non-Javadoc)
   * @see java.util.Set#containsAll(java.util.Collection)
   */
  public boolean containsAll(Collection<?> items) {
    return map.keySet().containsAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#isEmpty()
   */
  public boolean isEmpty() {
    return map.isEmpty();
  }

  /* (non-Javadoc)
   * @see java.util.Set#iterator()
   */
  public Iterator<Q> iterator() {
    return map.keySet().iterator();
  }

  /* (non-Javadoc)
   * @see java.util.Set#remove(java.lang.Object)
   */
  public boolean remove(Object item) {
    /* we double up argument as both key and value */
    return map.remove(item, Boolean.TRUE);
  }

  /* (non-Javadoc)
   * @see java.util.Set#removeAll(java.util.Collection)
   */
  public boolean removeAll(Collection<?> items) {
    return map.keySet().removeAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#retainAll(java.util.Collection)
   */
  public boolean retainAll(Collection<?> items) {
    return map.keySet().retainAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#size()
   */
  public int size() {
    return map.size();
  }

  /* (non-Javadoc)
   * @see java.util.Set#toArray()
   */
  public Object[] toArray() {
    return map.keySet().toArray();
  }

  /* (non-Javadoc)
   * @see java.util.Set#toArray(T[])
   */
  public <T> T[] toArray(T[] array) {
    return map.keySet().toArray(array);
  }


}








9.18.Set
9.18.1.Convert a List to a Set
9.18.2.Convert an ArrayList to HashSet
9.18.3.Creating a Sorted Set
9.18.4.Create new sets from Iterable, var argv
9.18.5.Create an array containing the elements in a set
9.18.6.Comparable with a sorted collection.
9.18.7.Duplicate elements are discarded
9.18.8.Creating a Set That Retains Order-of-Insertion
9.18.9.Convert Set into array
9.18.10.Convert Set into List
9.18.11.Copy all the elements from set2 to set1 (set1 += set2), set1 becomes the union of set1 and set2
9.18.12.Remove all the elements in set1 from set2 (set1 -= set2), set1 becomes the asymmetric difference of set1 and set2
9.18.13.Get the intersection of set1 and set2, set1 becomes the intersection of set1 and set2
9.18.14.Set operations: union, intersection, difference, symmetric difference, is subset, is superset
9.18.15.Remove all elements from a set
9.18.16.List Set
9.18.17.Set implementation that use == instead of equals()
9.18.18.Set union and intersection
9.18.19.Set with values iterated in insertion order.
9.18.20.Implements the Set interface, backed by a ConcurrentHashMap instance
9.18.21.A weak HashSet: element stored in the WeakHashSet might be garbage collected
9.18.22.An IdentitySet that uses reference-equality instead of object-equality
9.18.23.A thin wrapper around a List transforming it into a modifiable Set.
9.18.24.Concurrent set
9.18.25.Set that compares object by identity rather than equality