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