HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;

如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。

以下转载自:http://www.hijava.org/2010/02/how-to-judge-object-repeated-for-hashset/

查看了JDK源码,发现HashSet竟然是借助HashMap来实现的,利用HashMap中Key的唯一性,来保证HashSet中不出现重复值。具体参见代码:

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();public HashSet() {map = new HashMap<E,Object>();}public boolean contains(Object o) {return map.containsKey(o);}public boolean add(E e) {return map.put(e, PRESENT)==null;}
}

由此可见,HashSet中的元素实际上是作为HashMap中的Key存放在HashMap中的。下面是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;}}
}

从这段代码中可以看出,HashMap中的Key是根据对象的hashCode() 和 euqals()来判断是否唯一的。

结论:为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。

转载于:https://www.cnblogs.com/duanxz/p/3890038.html

HashSet中是如何判断元素是否重复的相关推荐

  1. python中if语句判断元素是否存在于列表中——if x: / if x is True: / if x == True: 的区别

    用x in list可以判断一个元素是否在list中,存在则返回True,不存在则返回False.所以我一开始就想直接用 == True来判断.这样运行不会报错,但是却不能正确判断.没有输出结果.这个 ...

  2. hash 值重复_面试题:HashSet是如何保证元素不重复的

    面试官:你能简单介绍List和Set有什么区别吗? 小憨: List是一个有序的集合,在内存是连续存储的,可以存储重复的元素,List查询快,增删慢: Set是一个无序的集合,在内存中不连续,不可以存 ...

  3. Selenium系列教程 - 使用 expected_conditions 判断元素

    主要内容 1. expected_conditions 模块 2. 使用场景 1. expected_conditions 模块 我们看一下 expected_conditions 提供的条件有哪些: ...

  4. 面试官:HashSet是如何保证元素不重复的?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 本文已收录<Java常见面试题>系列,开源地址:https: ...

  5. 给定一个整数数组,判断是否存在重复元素。

    存在重复元素 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false 示例 1: 输入: [1,2,3,1] ...

  6. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  7. Redis 笔记(06)— set 类型(向集合添加元素、获取集合元素个数、判断集合中是否包含某个元素、删除给定元素、返回集合中所有元素、计算集合的交集、并集、差集)

    Redis 的 set 集合内部的键值对是无序的唯一的.它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL .当集合中最后一个元素移除之后,数据结构自动删除,内存被回收. ...

  8. java set中元素是数组_将HashSet中的元素转换为Java中的数组

    首先,创建一个HashSet及其元素-HashSet hs = new HashSet(); //将元素添加到哈希集 hs.add("B"); hs.add("A&quo ...

  9. php in_array 判断数组中是否存在此元素

    判断数组中是否存在此元素在php中很简单,直接使用 in_array即可.用法如下 : <?php $array_1=array('red','blue','green'); if(in_arr ...

最新文章

  1. GIT:如何管理本机的多个ssh密钥(多个远程仓库账号)
  2. LruCache:从网络加载图片缓存实例
  3. dav1d 0.5.1:更快!
  4. oracle创建public链接,如何在oracle直接使用地址来创建database link
  5. 工作44:阅读代码1 dictionary
  6. centos7正确关机重启
  7. oracle 返回hashmap,解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错...
  8. Geek必备神器 - Google眼镜(Google glass)的十大特色
  9. 车辆路径问题与相关算法总结
  10. 积分商城使用教程之优惠券
  11. MSP430单片机个人学习笔记
  12. 性能测试培训:性能瓶颈分析思路
  13. 用WLW离线写cnblogs博文
  14. cad命令栏怎么调出来_软件CAD | 基本操作逻辑
  15. 现代化物流对应术语解释
  16. 转区系统开放艾欧尼亚转入服务器,LOL转区系统申请客户端及操作流程介绍
  17. python常用标准库的基本用法_Python常用标准库之fileinput
  18. 城市应急指挥系统建设方案(智慧应急综合管理平台)
  19. 算法:递归(借助递归树来求解分析递归算法的时间复杂度)
  20. 工业相机SDK使用Python打开无法显示图像

热门文章

  1. 关于iOS APP 需要支持ipv6-only 开发者需要做的事情
  2. Spring 从零開始-05
  3. 在WPF中显示动态GIF(转)
  4. 加入域时遇到“找不到网络路径”错误解决办法汇总
  5. json数据交换的例了
  6. Android studio导入另外一个项目作为Library后出现两个启动项目等各类问题
  7. android 如何使用Parcelable接口
  8. android 自定义checkBox的样式
  9. ubuntu下创建图标
  10. 15-垃圾回收相关算法