详述Java中HashSet类add方法(五)

因为重复的储存对象Jim依然可以保存,则还需重写equals方法

1. 在学生类中重写equals方法

public class Student {

	private String name;
	
	public Student(String name) {
		this.name= name;
	}

	public int hashCode() {
		return name.hashCode();
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof Student ){
			Student stu = (Student)obj;
			return this.name.equals(stu.name);
		}
		return false;
	}
}

2. 在Test类中创建HashSet集合并导入Student

import java.util.HashSet;

public class Test {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		set.add(new Student("Jim"));
		set.add(new Student("Jim"));
	}
}

putVal方法:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
        Node[] tab; Node p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node e; K k;
            if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) 
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
}

分析:

if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;

因为(k = p.key) == key为false,又学生类中重写了equals方法,则key.equals(k)为true,即该处if结论为true,故e = p;

if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }

因为e = p,则返回Jim的值,储存失败

你可能感兴趣的:(详述Java中HashSet类add方法(五))