hashSet集合去重的一个误区
程序员文章站
2022-04-08 08:19:57
...
最近工作上遇到的一个需要去除重复对象值得一个问题!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的方式就可以了。
推荐阅读
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
Java HashSet对txt文本内容去重(统计小说用过的字或字数)
-
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
-
python去重,一个由dict组成的list的去重示例
-
[PHP] PHP多个进程配合redis的有序集合实现大文件去重
-
2020.7.24 一个130行代码的清洗数据的小工具,多种表分类聚合去重补全-zkjs_wang
-
利用Distinct()内置方法对List集合的去重问题详解
-
分享一个H5数组去重的前端面试题