黑马程序员技术交流社区

标题: hashset [打印本页]

作者: 钱程永    时间: 2014-7-14 23:17
标题: hashset
Hashset判断和删除的依据是什么?

作者: 依然超级赛亚人    时间: 2014-7-14 23:26
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。
作者: zhxu188    时间: 2014-7-15 09:41
在JDK的源码中HashSet是借助HashMap来实现的,源码如下
  1. public class HashSet<E>
  2.     extends AbstractSet<E>
  3.     implements Set<E>, Cloneable, java.io.Serializable
  4. {
  5.     private transient HashMap<E,Object> map;

  6.     // Dummy value to associate with an Object in the backing Map
  7.     private static final Object PRESENT = new Object();

  8.     public HashSet() {
  9.     map = new HashMap<E,Object>();
  10.     }

  11.     public boolean contains(Object o) {
  12.     return map.containsKey(o);
  13.     }

  14.     public boolean add(E e) {
  15.     return map.put(e, PRESENT)==null;
  16.     }
  17. }
复制代码
利用HashMap中Key的唯一性,来保证HashSet中不出现重复值。HashSet中的元素实际上是作为HashMap中的Key存放在HashMap中的。HashMap中的put方法源码如下
  1. public V put(K key, V value) {
  2.     if (key == null)
  3.         return putForNullKey(value);
  4.     int hash = hash(key.hashCode());
  5.     int i = indexFor(hash, table.length);
  6.     for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  7.         Object k;
  8.         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  9.         V oldValue = e.value;
  10.         e.value = value;
  11.         e.recordAccess(this);
  12.         return oldValue;
  13.         }
  14.     }
  15. }
复制代码
HashMap中的Key是根据对象的hashCode() 和 euqals()来判断是否唯一的。为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。所以hashSet的判断和删除依据是hashCode()和equals()这两个方法
作者: 钱程永    时间: 2014-7-15 10:48
zhxu188 发表于 2014-7-15 09:41
在JDK的源码中HashSet是借助HashMap来实现的,源码如下利用HashMap中Key的唯一性,来保证HashSet中不出现重 ...

ok,谢谢!
作者: zxdanshui    时间: 2014-7-15 10:50
zhxu188 发表于 2014-7-15 09:41
在JDK的源码中HashSet是借助HashMap来实现的,源码如下利用HashMap中Key的唯一性,来保证HashSet中不出现重 ...

学习了   
作者: 钱程永    时间: 2014-7-15 10:51
依然超级赛亚人 发表于 2014-7-14 23:26
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。 ...

谢谢:handshake:handshake
作者: 钱程永    时间: 2014-7-15 10:55
依然超级赛亚人 发表于 2014-7-14 23:26
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。 ...

:handshake:handshake:handshake:handshake
作者: 南柯一梦    时间: 2014-7-15 13:25
Hashset底层数据结构是哈希表结构,因此判断和删除都需要先依据hashCode判断地址值是否相同,若相同在复写equals方法判断对象是否一样,若一样就代表是同一个对象
作者: 风决    时间: 2014-7-15 17:34
依据hashCode()和equals()
作者: 小七    时间: 2014-7-15 17:44
如果我没想错的话应该是哈希值是否相等来判断是否有这个对象,而哈希值通过hashcode获得。
作者: TreeSet    时间: 2014-7-15 18:03
HashSet集合判断元素是否相同,依据的是元素的hashCode和equals方法,先调用hashCode.元素的hashCode值相同会调用equals方法.所以要对自定义元素的hashCode和equals方法进行复写.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2