这种问题的最好解决办法,就是查看一下JDK源码来解决你的疑惑:我们先看一下,set集合的一个具体实现类:HashSet,其中的add(E e)方法的源码如下:- /**
- * Adds the specified element to this set if it is not already present.
- * More formally, adds the specified element <tt>e</tt> to this set if
- * this set contains no element <tt>e2</tt> such that
- * <tt>(e==null ? e2==null : e.equals(e2))</tt>.
- * If this set already contains the element, the call leaves the set
- * unchanged and returns <tt>false</tt>.
- *
- * @param e element to be added to this set
- * @return <tt>true</tt> if this set did not already contain the specified
- * element
- */
- public boolean add(E e) {
- return map.put(e, PRESENT)==null;
- }
复制代码 显然HashSet在添加元素的时候,使用的是一个HashMap<E,Object> map结构集合去存储,那么我们就去HashMap中找到put方法是如何实现的就知道是如何解决的了,代码如下:- 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;
- }
复制代码 看到这些代码,也许你就会明白,如何实现去除重复元素了,我们在hashset中加入元素的时候,是判断当前值的hash值与集中合的元素的hash值进行比较,如果相同,则不会向集合中添加新元素,而只是对原来有的元素进行修改。就讲到这里吧,希望对你有帮助
|