HashSet重復元素判斷


HashSet不能添加重復的元素,當調用add(Object)方法時候,
首先會調用Object的hashCode方法判hashCode是否已經存在,如不存在則直接插入元素;
如果已存在則調用Object對象的equals方法判斷是否返回true, 如果為true則說明元素已經存在,如為false則插入元素。
例如Person類,重寫hashCode方法和equals方法,用以判斷傳入集合的元素是否已經存在。


package com.test;
import java.util.HashSet;


public class HashSetDemo {
 public static void main(String[] args) {
  HashSet<Person> set = new HashSet<Person>();
  Person p1 = new Person("張三");
  Person p2 = new Person("張三");
  boolean flag1 = set.add(p1);// 首先調用p1對象的hashCode進行判斷,如果不存在相同的hashCode,則調equals方法進行判斷。
  boolean flag2 = set.add(p2);// 首先調用p2對象的hashCode進行判斷,如果不存在相同的hashCode,則調equals方法進行判斷。
  System.out.println("flag1的值為:" + flag1);// flag1的值為:true
  System.out.println("flag2的值為:" + flag2);// flag2的值為:false.因為p1與p2是永遠相同的hashCode並且有相同的name。
  System.out.println("set的值為:" + set);
 }
}
class Person {
 private String name;
 Person(String name) {//有參構造器
  this.name = name;
 }
 @Override
 public int hashCode() {// 重寫hashCode方法
  return this.name.hashCode();
 }
 @Override
 public boolean equals(Object obj) {// 重寫equals方法
  if (this == obj) {
   return true;
  }
  if (null != obj && obj instanceof Person) {
   Person p = (Person) obj;
   if (name.equals(p.name)) {// 判斷name是否相同
    return true;
   }
  }
  return false;
 }
}

運行結果:
flag1的值為:true
flag2的值為:false------->p2沒有插入成功返回false
set的值為:[com.test.Person@bd2e0] ---->set只有一個元素



原文地址:
http://hi.baidu.com/xiaolincc26/blog/item/ccc1c91211d7063cdc540177.html

總結:set接口是通過equals來判斷是否重復的,hashset是一種加快判斷效率的一種實現,先通過hashcode判斷(hashcode通過運算求出數組下標,通過下標判斷是否有對象存在),如果重復,再equal比較。

存儲:
http://hi.baidu.com/maxia0708/blog/item/7666078282a297cfbd3e1ef8.html
http://hxraid.iteye.com/blog/448884


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM