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重复元素判断的更多相关文章

  1. 【LeetCode】217.存在重复元素

    217. 存在重复元素 知识点:数组:Set: 题目描述 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 fals ...

  2. 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素

    原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ...

  3. 排序及重复元素去重的说明,TreeSet,HashSet

    先看下面一段代码: package 类集; import java.util.Set; import java.util.TreeSet; class Person{ private String n ...

  4. c#:判断一个数组元素中否有重复元素

    给定一个数组,判定该数组中是否有重复元素. 判定该数组中是否有重复元素总结出以下实现方案: using System; using System.Collections.Generic; using ...

  5. Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素?

    首先将源码逐级找出来1.HashSet<String> hs=new HashSet<String>();         hs.add("hello"); ...

  6. JS判断数组中是否有重复元素的方法

    判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...

  7. js判断数组里是否有重复元素的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/longzhoufeng/article/details/78840974 第一种方法:但是下面的这种 ...

  8. js判断数组中是否有重复元素

    方法一:正则 var ary = new Array("111","ff","222","aa","222&q ...

  9. Leetcode 存在重复元素 (219,220)

    219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. / ...

随机推荐

  1. 10分钟学会前端工程化(webpack4.0)

    一.概要 1.1.前端工程化 随着前端的不断发展与壮大,前端变得越来越复杂,组件化.模块化.工程化.自动化成了前端发展中不可或缺的一部分,具体到前端工程化,面临的问题是如何提高编码->测试-&g ...

  2. 修复OS X的Finder中文档 打开方式中重复程序的问题

    如上图,OS X在使用一段时间后,有些软件就会重复注册打开方式,对于有洁癖的人,这是难以接受的事. 不过有个命令可以很简单的把重复项给去掉. /System/Library/Frameworks/Co ...

  3. iOS中创建自定义的圆角按钮

    iOS中很多时候都需要用到指定风格的圆角按钮,尽管UIButton提供了一个方式创建圆角按钮: + (id)buttonWithType:(UIButtonType)buttonType;//指定bu ...

  4. Elasticsearch 之 慘痛部署(分片移位)

    部署说明 硬件 server两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点.10个存储节点 8个主分片 1个复制分片(每一个分片都有一个副本分布在不同的节点上面) 每 ...

  5. Linux CentOS下安装、配置mysql数据库

    假设要在Linux上做j2ee开发.首先得搭建好j2ee的开发环境.包含了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有具体解说了Linux学习之CentOS(七)--Cen ...

  6. csu1116 Kingdoms 最小生成树-枚举状态

    题目链接: csu 1116 题意: 有一幅双向图连接N个城市(标号1~n,1表示首都)  每一个城市有一个价值W. 地震摧毁了全部道路,现给出可修复的m条道路并给出修复每条道路所需的费用 问在总费用 ...

  7. uboot 对 FAT 分区的解析

    uboot 对 FAT 分区的解析 改写 UBOOT 从 U 盘读入固件,然后刷机.发现有的 U 盘无法正确读到分区,跟踪了一下发现自己写的代码有漏洞,只尝试解析分区表里的第一个分区.跟踪的过程中重温 ...

  8. IOS版DesiredCapabilities参数配置

    前言 相比较Android的DesiredCapabilities参数配置,IOS的相对而言比较复杂. 特别是在真机上跑的时候,参数就更加复杂. DesiredCapabilities参数配置 模拟器 ...

  9. Spring中的AOP(学习笔记)

    是什么AOP及实现方式 AOP的基本概念 Schema-base AOP Spring AOP API AspectJ

  10. mvn_action

    validate(验证): 验证项目正确,并且所有必要信息可用. compile(编译): 编译项目源码 test(测试): 使用合适的单元测试框架测试编译后的源码. package(打包): 源码编 ...