A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钱程永 中级黑马   /  2014-7-14 23:17  /  1352 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Hashset判断和删除的依据是什么?

10 个回复

倒序浏览
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。
回复 使用道具 举报
在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()这两个方法

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
zhxu188 发表于 2014-7-15 09:41
在JDK的源码中HashSet是借助HashMap来实现的,源码如下利用HashMap中Key的唯一性,来保证HashSet中不出现重 ...

ok,谢谢!
回复 使用道具 举报
zhxu188 发表于 2014-7-15 09:41
在JDK的源码中HashSet是借助HashMap来实现的,源码如下利用HashMap中Key的唯一性,来保证HashSet中不出现重 ...

学习了   
回复 使用道具 举报
依然超级赛亚人 发表于 2014-7-14 23:26
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。 ...

谢谢:handshake:handshake
回复 使用道具 举报
依然超级赛亚人 发表于 2014-7-14 23:26
看一下源码应该有答案。不过这似乎不用掌握吧,知道它保证唯一的依据就可以了,而且那代码都可以自动生成。 ...

:handshake:handshake:handshake:handshake
回复 使用道具 举报
Hashset底层数据结构是哈希表结构,因此判断和删除都需要先依据hashCode判断地址值是否相同,若相同在复写equals方法判断对象是否一样,若一样就代表是同一个对象
回复 使用道具 举报
风决 中级黑马 2014-7-15 17:34:27
9#
依据hashCode()和equals()
回复 使用道具 举报
如果我没想错的话应该是哈希值是否相等来判断是否有这个对象,而哈希值通过hashcode获得。
回复 使用道具 举报
HashSet集合判断元素是否相同,依据的是元素的hashCode和equals方法,先调用hashCode.元素的hashCode值相同会调用equals方法.所以要对自定义元素的hashCode和equals方法进行复写.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马