HashSet重复元素判断
HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true, 如果为true则说明元素已经存在,如为false则插入元素。
例如Person类,重写hashCode方法和equals方法,用以判断传入集合的元素是否已经存在。
package com.test;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<Person>();
Person p1 = new Person("张三");
Person p2 = new Person("张三");
boolean flag1 = set.add(p1);// 首先调用p1对象的hashCode进行判断,如果不存在相同的hashCode,则调equals方法进行判断。
boolean flag2 = set.add(p2);// 首先调用p2对象的hashCode进行判断,如果不存在相同的hashCode,则调equals方法进行判断。
System.out.println("flag1的值为:" + flag1);// flag1的值为:true
System.out.println("flag2的值为:" + flag2);// flag2的值为:false.因为p1与p2是永远相同的hashCode并且有相同的name。
System.out.println("set的值为:" + set);
}
}
class Person {
private String name;
Person(String name) {//有参构造器
this.name = name;
}
@Override
public int hashCode() {// 重写hashCode方法
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {// 重写equals方法
if (this == obj) {
return true;
}
if (null != obj && obj instanceof Person) {
Person p = (Person) obj;
if (name.equals(p.name)) {// 判断name是否相同
return true;
}
}
return false;
}
}
运行结果:
flag1的值为:true
flag2的值为:false------->p2没有插入成功返回false
set的值为:[com.test.Person@bd2e0] ---->set只有一个元素
原文地址:
http://hi.baidu.com/xiaolincc26/blog/item/ccc1c91211d7063cdc540177.html
总结:set接口是通过equals来判断是否重复的,hashset是一种加快判断效率的一种实现,先通过hashcode判断(hashcode通过运算求出数组下标,通过下标判断是否有对象存在),如果重复,再equal比较。
存储:
http://hi.baidu.com/maxia0708/blog/item/7666078282a297cfbd3e1ef8.html
http://hxraid.iteye.com/blog/448884
HashSet重复元素判断的更多相关文章
- 【LeetCode】217.存在重复元素
217. 存在重复元素 知识点:数组:Set: 题目描述 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 fals ...
- 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素
原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ...
- 排序及重复元素去重的说明,TreeSet,HashSet
先看下面一段代码: package 类集; import java.util.Set; import java.util.TreeSet; class Person{ private String n ...
- c#:判断一个数组元素中否有重复元素
给定一个数组,判定该数组中是否有重复元素. 判定该数组中是否有重复元素总结出以下实现方案: using System; using System.Collections.Generic; using ...
- Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素?
首先将源码逐级找出来1.HashSet<String> hs=new HashSet<String>(); hs.add("hello"); ...
- JS判断数组中是否有重复元素的方法
判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...
- js判断数组里是否有重复元素的方法
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/longzhoufeng/article/details/78840974 第一种方法:但是下面的这种 ...
- js判断数组中是否有重复元素
方法一:正则 var ary = new Array("111","ff","222","aa","222&q ...
- Leetcode 存在重复元素 (219,220)
219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. / ...
随机推荐
- lib无法访问另外lib中的头文件
工程中app已经有设置User Header Search Paths来包含了需要的头文件,但是个别的lib依然找不到头文件.解决方法: 选择这个lib,在Build Settings中查找选项Use ...
- Android PullToRefresh 下拉刷新,上拉很多其它,支持ScrollView,ListView,可方便拓展GridView,WebView等
在写着东西之前.从网上找到非常多这方面的源代码,可是基本没有找到惬意的.包含在GitHub上的比較有名的Android-PullToRefresh-master.思来想去还是自己写吧.当然当中借鉴了一 ...
- Java基础:执行时异常和非执行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为全部异常的超类. Java中的异常分为两大类:错误Error和异常Exception.Jav ...
- 远程连接mysql速度慢的解决方法:skip-name-resolve取消DNS的反向解析
PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的 MYSQL开启了DNS的反向解析,在MY.INI(WINDOW ...
- Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除
//由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值 IFeatureClass featureClass = null; //获取某个字段的索引,后面取字段值用 ...
- HDU 3639 Hawk-and-Chicken
Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Android — 长按ListView 利用上下文菜单(ActionMode) 进行批量事件处理
好久没写博客拉``````` 近期最终略微闲一点了``````` 无聊拿手机清理短信.发现批量事件的处理还是挺管用的`````` 那么自己也来山寨一记看看效果吧````` 闲话少说,首先,我们来看下手 ...
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中加入自己定义列办事处
需求描写叙述:依据LC业务部门提出的需求.须要在COOIS中加入办事处一列. 1.在IOHEADER_TAB的CI_IOHEADER中加入字段办事处.如以下图所看到的: watermark/2/t ...
- PPAPI与Browser间使用AsyncIPC通信
採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc).来完毕PPAPI Plugin进程与Browser进程的通信. foruok原创.如需转载请关注f ...
- Spark理论学习笔记(一)
1.调度 分为FIFO和FAIR两种模式 创建调度池:sc.setLocalProperty("spark.scheduler.pool", "pool6") ...