hashSet集合去重的一个误区

最近工作上遇到的一个需要去除重复对象值得一个问题!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的方式就可以了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值