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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。