Set that compares object by identity rather than equality : Set « Collections « Java Tutorial

// $Id: 16179 2009-03-18 11:08:10Z hardy.ferentschik $
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.

import java.util.Collection;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

 * Set that compares object by identity rather than equality. Wraps around a <code>IdentityHashMap</code>
 * @author Emmanuel Bernard
public class IdentitySet implements Set {
  private Map<Object, Object> map;
  private Object CONTAINS = new Object();

  public IdentitySet() {
    this( 10 );

  public IdentitySet(int size) { = new IdentityHashMap<Object, Object>( size );

  public int size() {
    return map.size();

  public boolean isEmpty() {
    return map.isEmpty();

  public boolean contains(Object o) {
    return map.containsKey( o );

  public Iterator iterator() {
    return map.keySet().iterator();

  public Object[] toArray() {
    return map.keySet().toArray();

  public boolean add(Object o) {
    return map.put( o, CONTAINS ) == null;

  public boolean remove(Object o) {
    return map.remove( o ) == CONTAINS;

  public boolean addAll(Collection c) {
    boolean doThing = false;
    for ( Object o : c ) {
      doThing = doThing || add( o );
    return doThing;

  public void clear() {

  public boolean removeAll(Collection c) {
    boolean remove = false;
    for ( Object o : c ) {
      remove = remove || remove( o );
    return remove;

  public boolean retainAll(Collection c) {
    throw new UnsupportedOperationException();

  public boolean containsAll(Collection c) {
    for ( Object o : c ) {
      if ( !contains( o ) ) {
        return false;
    return true;

  public Object[] toArray(Object[] a) {
    return map.keySet().toArray( a );

  public String toString() {
    return "IdentitySet{" +
        "map=" + map +

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