欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的方式就可以了。