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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 普哥 中级黑马   /  2014-7-5 21:08  /  1355 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题,HashSet是如何保证元素唯一性的呢?

4 个回复

倒序浏览
给你看下源码吧,
  1. public V put(K key, V value) {
  2.         if (table == EMPTY_TABLE) {
  3.             inflateTable(threshold);
  4.         }
  5.         if (key == null)
  6.             return putForNullKey(value);
  7.         int hash = hash(key);
  8.         int i = indexFor(hash, table.length);
  9.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  10.             Object k;
  11.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  12.                 V oldValue = e.value;
  13.                 e.value = value;
  14.                 e.recordAccess(this);
  15.                 return oldValue;
  16.             }
  17.         }

  18.         modCount++;
  19.         addEntry(hash, key, value, i);
  20.         return null;
  21.     }
复制代码


当你往map中放值得时候,它会去已有的值里去检查,如果已存在就返回原来的,如果没有,就存进去。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
暮雨 发表于 2014-7-5 21:30
给你看下源码吧,

学习了:)
回复 使用道具 举报
调用底层equals()方法,假如值相同则不添加,不同才会添加,这是保证唯一性的底层原理。
回复 使用道具 举报
在HashSet类调用add()方法添加对象时,底层会首先(注意这个是首先)调用对象的hashCode()方法。

比如说你添加的对象是String类型,那么就调用String的hashCode()方法。如果是自建类,如Person,那么这时候就要注意了,首先看Person类复写了hashCode()么,如果没有,因为所有类都有一个根类Object,而Object中有hashCode()这个方法,所以相当于Person继承了这个方法,如果不复写,就会直接调用继承过来的,那么new出来的对象必然是不相同的,所以必定完蛋。——————这个说的比较啰嗦,不明白再讨论。

调用了hashCode()方法之后,会调用equals()方法,跟上一段说的一样,如果是自建类,如Person,那么就要复写euqals()方法。

毕老师的视频看过两遍,这个问题绝对能解决。

我说的清楚了么?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马