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

xiaoxiao2021-02-28  10

今天使用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()才能执行。

转载请注明原文地址: https://www.6miu.com/read-2650093.html

最新回复(0)