Set的add()方法判断是否重复

今天使用Set的时候想起了之前发现的一个问题。使用Eclipse的自动生成代码功能的时候,hashCode()equals()一直是同时生成的。在调用Set.add()方法向Set中添加元素的时候需要进行判断,如果添加的元素重复的话将返回false。之前吃过一次亏,知道了调用这个方法的时候需要调用Set声明的数据类型的hashCode()或者equals()之一才能正常实现,但是由于两个方法一直是同时被IDE生成的,并不知道具体是调用的哪一个。今天Debug的时候终于弄清楚了。

剧透:hashCode()

来源:

在之前实验中需要调用Set.add()的地方设置断点

@Override
public boolean add(L vertex) {
	if (vertices.contains(vertex)) {
		return false;
	} else {
		vertices.add(vertex); // 这行添加断点
		checkRep();
		return true;
	}
}
其中
private final Set<L> vertices = new HashSet<>();

这样就调用了Set.add()方法。Debug,到这行的时候Step Into,进入了HashSet.class文件中的HashSet<E>.add(E)方法处

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

继续Step Into,到了HashMap.class的HashMap<K,V>.put(K,V)方法

public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }
这里就已经能看到一个hash(key)的参数了,但还没完全,继续Step Into,到了HashMap<K,V>.hash(Object)处
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

这里我们就见到了key.hashCode()方法,在这里调用最开始的Set中的对象的hashCode()方法。这里的hash()方法是Java8的版本,在之前的基础上更进一步进行了对哈希值的分散性处理。putVal()判断先前的HashSet中是否存在此元素,依据是hash(key)和key。

因此,之后需要调用Set.add()方法时,至少要在自己的对象类中实现HashCode()才能执行。



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值