読者です 読者をやめる 読者になる 読者になる

Java で HashSet の add

というか

    public boolean add(E e) {
	return map.put(e, PRESENT)==null;
    }

なので HashMap の挙動なんだけど

    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

な感じ HashCode の比較と equals が || で評価されてて
ちょっと気になったので書いてみた。
(基本、map の put なども含めて HashCode の一致を見て真だったら、equals使うと思ってたので)

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		class A {

			@Override
			public boolean equals(Object obj) {
				return true;
			}
			
		}
		class B {
			@Override
			public boolean equals(Object obj) {
				return true;
			}

			@Override
			public int hashCode() {
				return 1;
			}
			
		}
		
		HashSet<A> hashSet = new HashSet<A>();
		hashSet.add(new A());
		hashSet.add(new A());
		hashSet.add(new A());
		hashSet.add(new A());
		hashSet.add(new A());
		HashSet<B> hashSet2 = new HashSet<B>();
		hashSet2.add(new B());
		hashSet2.add(new B());
		hashSet2.add(new B());
		hashSet2.add(new B());
		hashSet2.add(new B());
		System.out.println("A's hashset : " + hashSet.size());
		System.out.println("B's hashset : " + hashSet2.size());
	}

}

結果

A's hashset : 5
B's hashset : 1

あってた