最近工作上遇到的一个需要去除重复对象值得一个问题!hashSet在存储数据的时候,他的去重原理是对象的hashcode不一致才能存进去,如果相同时不能存的,但是如果当你利用生成对象然后设置数据值得时候放进去不希望相同值的对象也能放进去的时候就会出现问题,下面贴一个简单的例子介绍下就知道了!
import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class HashSetMisunderstanding { public static void main(String[] args) { new HashSetMisunderstanding().judgeList(); } public void judgeList(){ Set<A> list = new HashSet<A>();//这里创建一个hashset集合 for(int i=1;i<4;i++){ A a = new A(1,1);//循环中创建新的对象A来存储相同的数据 list.add(a); } for(int i=2;i<6;i++){ A a= new A(1,1); if(list.add(a)){//判断是否能存储进去 System.out.println("添加成功->"+i); } } for(A a:list){ System.out.println(a.toString());//打印出相应的值 看看是否唯一 } } class A implements Serializable{ private static final long serialVersionUID = 1L; private Integer mi; private Integer bi; public A() { super(); } public A(Integer mi, Integer bi) { super(); this.mi = mi; this.bi = bi; } public Integer getMi() { return mi; } public Integer getBi() { return bi; } public void setMi(Integer mi) { this.mi = mi; } public void setBi(Integer bi) { this.bi = bi; } @Override public String toString() { return (mi==null?mi:mi.toString())+"--"+(bi==null?bi:bi.toString()); } } }
最后打印出来的结果就是:
添加成功->2
添加成功->3
添加成功->4
添加成功->5
1--1
1--1
1--1
1--1
1--1
1--1
1--1
从上面结果可以看出来,相同值得对象是会被添加到hashset里面的,但是如果将创建A对象的位置变一下得到的结果就不一样了:
public void judgeList(){ Set<A> list = new HashSet<A>();//这里创建一个hashset集合 A a = new A(1,1);//循环中创建新的对象A来存储相同的数据 for(int i=1;i<4;i++){ list.add(a); } for(int i=2;i<6;i++){ if(list.add(a)){//判断是否能存储进去 System.out.println("添加成功->"+i); } } for(A aa:list){ System.out.println(aa.toString());//打印出相应的值 看看是否唯一 } }
如上的时候就只会有一个值出来!因为创建的A对象只有一个hashcode值,这个时候就是不能重复添加的!
以上只是经验之谈,希望对有你有帮助,如果有更好的解释,希望您也能贴出来给大家一起分享!
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((判定字段== null) ? 0 : 判定字段.hashCode()); return result; }
使用复写hashCode的方式就可以了。
相关推荐
hashSet底层去重原理
简述了HashSet去重原理
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
在list集合中输入元素,去除重复的元素并输出 1.使用for i循环去重 2.使用迭代器去重 3.使用HashSet特性去重
set集合是无序的相较于list集合是没有下标的,hashset底层去重,与hashCode、equals方法相关,排序的元素不是String,而是对象Person
1:contains判断去重(有序) 此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序...Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。
主要介绍了Java中List集合对象去重及按属性去重的8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一地的参考借鉴价值,需要的朋友可以参考下
主要介绍了Java HashSet集合存储遍历学生对象代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了hashset去除重复值原理实例解析,具有一定借鉴价值,需要的朋友可以参考下。
已设置JavaScript中的简单哈希集创建一个新的HashSet var HashSet = require ( 'hashset' ) ;//Create an empty hash setvar hashset = new HashSet ( ) ;//Create a hash set an initialize it with a value 'a'var...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用
我们上课教学用的一个示例, 不知老师从哪弄来的, 觉得不错就拿上来和大家分享了 ^ ^
c++一个用vector实现java的HashSet集合类,可以将任何类,数字,字符串,vector等等存放到里面
hashMap可以通过一个键值与一个对象一一对应的关系找到我们要找的对象,再调用对象里面的方法
1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 姓名:李四 身份证号:178880003 姓名:王五 身份证号:178880002 姓名:李四 身份证...
HashSet的实现原理 ,HashSet与HashMap的区别 以及 HashSet的底层实现方式
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...