Java Set集合去重的原理及实现
在开发中经常使用到Set集合去重,那么去重的原理是怎样实现的呢?在此文章记录一下去重原理!!!
下面是set集合类图
下面我们来跟踪一下执行过程;
首先我们实例化一个Set对象;
Set<8大基本类型>set=newHashSet<8大基本类型>(); set.add(8大基本类型);
add操作会调用HashMap中的add方法;
publicbooleanadd(Ee){
returnmap.put(e,PRESENT)==null;
}
HashMap中的add方法依赖了HashMap的put方法;
publicVput(Kkey,Vvalue){
if(key==null)
returnputForNullKey(value);
inthash=hash(key.hashCode());
inti=indexFor(hash,table.length);
for(Entrye=table[i];e!=null;e=e.next){//每添加一个,则循环判断是否与map中的元素相等
Objectk;
//先判断hashcode是否一致,然后再判断值是否相等
if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
VoldValue=e.value;
e.value=value;
e.recordAccess(this);
returnoldValue;
}
}
modCount++;
addEntry(hash,key,value,i);
returnnull;
}
但是上述方法只对基本数据类型有效,下面是应用到复杂对象的讲解。
下面就是重写对象User的实现,重写equals和hashCode方法;
测试类
publicclassUser{
//id
protectedIntegerid;
//username
protectedStringusername;
//构造方法
publicUser(intid,Stringusername){
this.id=id;
this.username=username;
}
/**
*如果对象是USER,先比较hashcode,一致的场合在比价每个属性的值
*/
@Override
publicbooleanequals(Objectobj){
if(obj==null)
returnfalse;
if(this==obj)
returntrue;
if(objinstanceofUser){
Useruser=(User)obj;
//if(user.id==this.id)returntrue;//只比较id
//比较id和username一致时才返回true,之后再去比较hashCode
if(user.id==this.id&&user.username.equals(this.username)){
returntrue;
}
}
returnfalse;
}
/**
*
*重写hashCode方法,返回的hashCode不一样才认为是不一样的对象;
*/
@Override
publicinthashCode(){
//returnid.hashCode();只比较id,id不一样就添加进集合;
returnid.hashCode()*username.hashCode();
}
}
实现类
importjava.util.HashSet;
importjava.util.Set;
publicclasstest{
publicstaticvoidmain(String[]args){
Useruser1=newUser(1,"xiaoqiang");
Useruser2=newUser(2,"xiaoqiang");
Useruser3=newUser(1,"xiaoqiang");
Useruser4=newUser(1,"xiaoqiang");
Setset=newHashSet();
set.add(user1);
set.add(user2);
set.add(user3);
set.add(user4);
for(Useru:set){
System.out.println("id:"+u.id+"username:"+u.username);
}
}
}
输出结果
id:2username:xiaoqiang
id:1username:xiaoqiang
以上就是JavaSet集合去重的原理及实现的详细内容,更多关于JavaSet集合去重的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。