HashSet中是如何判断元素是否重复的
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 Map
private 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()这两个方法。
HashSet中是如何判断元素是否重复的的更多相关文章
- es7中数组如何判断元素是否存在
		const arr = [1,2,3,4,5,6] console.log(arr.includes(4)) //true 
- HashSet集合存储数据的结构和HashSet集合存储元素不重复的原理
		HashSet集合存储数据的结构 HashSet集合存储元素不重复的原理 //创建HashSet集合对象 Hashset<String> set = new HashSet<> ... 
- HashSet 如何保证元素不重复——hash码
		HashSet 不重复主要add 方法实现,使用 add 方法找到是否存在元素,存在就不添加,不存在就添加.HashSet 主要是基于HashMap 实现的,HashMap 的key就是 HashSe ... 
- 集合框架(HashSet存储自定义对象保证元素唯一性)
		HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ... 
- 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素
		原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ... 
- HashSet中存放不重复元素
		一.自定义对象存放在hashSet中,保证元素不重复.重写hashCode()和equals()方法 public class Student{ private String name; privat ... 
- HashSet怎样保证元素不重复
		文章同步更新在个人博客:HashSet怎样保证元素不重复 都知道HashSet中不能存放重复元素,有时候可以用来做去重操作等.但是其内部是怎么保证元素不重复的呢?下面从源码去看看. 打开HashSet ... 
- 面试官:HashSet如何保证元素不重复?
		本文已收录<Java常见面试题>系列,Git 开源地址:https://gitee.com/mydb/interview HashSet 实现了 Set 接口,由哈希表(实际是 HashM ... 
- Java中数组判断元素存在几种方式比较详解
		1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ... 
随机推荐
- Response对象介绍(服务器到客户端)
			1.response的状态码和响应头设置 package com.test; import java.io.IOException; import java.io.PrintWriter; impor ... 
- LeetCode——Construct Binary Tree from Preorder and Inorder Traversal
			Question Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may as ... 
- 利用PushbackReader读取文件中某个字符串之前的内容
			package File; import java.io.FileReader; import java.io.IOException; import java.io.PushbackReader; ... 
- Centos 查看版本
			# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 
- 刻录DVD.Win7系统盘(U盘)
			ZC:Win7x86的U盘安装盘做好之后,U盘 里面会留有 引导信息,在以后不想要它(引导信息)的时候 该如果将它删掉?直接普通的格式化 能行吗? ZC:(20180423)发现,UltraISO制作 ... 
- 解析Ceph: RBDCache 背后的世界
			转自:https://www.ustack.com/blog/ceph-internal-rbdcache/ RBDCache 是Ceph的块存储接口实现库 Librbd 的用来在客户端侧缓存数据的目 ... 
- SQL Server 删除默认值
			alter table st_FuelConvertPatternSetting alter column tank_max_size decimal(5,2) not null declare @c ... 
- js对象数组 根据某个共同字段 分组
			var arr = [ {"id":"1001","name":"值1","value":" ... 
- [转载]Java开发在线打开编辑保存Word文件
			Java调用logo是“P”图标的第三方插件,实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 工具/原料 Eclipse或MyEclipse等j ... 
- Java企业微信开发_15_查询企业微信域名对应的所有ip
			一.前言 二.方法 1.在线网站 百度搜索"域名查IP",可查到如下网站,输入域名即可查到所有IP: 站长工具 site.ip138.com tools.ipip.net 2.li ... 
