set集合是collection下的接口侨艾,無(wú)序不重復(fù)。set中的方法與collection中的方法相同羡滑。
它的下面也有一些實(shí)現(xiàn)類
hashset類:它的底層是一個(gè)哈希表菇爪,當(dāng)一個(gè)對(duì)象要在hashset中存放的時(shí)候,會(huì)拿這個(gè)對(duì)象根據(jù)算法算出它在數(shù)組中的位置柒昏。這個(gè)算法就是Object中的hashcode方法凳宙。
它的底層容量是16,當(dāng)內(nèi)存不夠是职祷,以0.75倍增長(zhǎng)氏涩。
給hashset存放對(duì)象時(shí)應(yīng)該注意什么問(wèn)題:
一定要根據(jù)對(duì)象的特有數(shù)據(jù)計(jì)算哈希值届囚,并且通過(guò)equals方法進(jìn)行比較。所以自定義對(duì)象所屬的類一定要對(duì)hashcode equals toString進(jìn)行復(fù)寫(xiě)是尖。
hashset如何保證自定義對(duì)象的唯一:
自定義對(duì)象根據(jù)對(duì)象的特有數(shù)據(jù)計(jì)算哈希值意系,如果相同再在equals方法中比較如果返回true則兩對(duì)象有相同地址兩對(duì)象是同一個(gè),不保存饺汹,如果哈希值相同equals返回fals依然保存蛔添。
import java.util.HashSet;
import java.util.Iterator;
class People {
private String name;
private int age;
public People(String string, int i) {
// TODO Auto-generated constructor stub
this.name=string;
this.age=i;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return age*2;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + "]";
}
}
public class HashsetDemo {
public static void main(String[] args) {
HashSet h=new HashSet();
h.add(new People("lishuai",22));
h.add(new People("lishuai",22));
h.add(new People("wangwu",20));
h.add(new People("zhangxi",29));
h.add(new People("lishuai",22));
for(Iterator i=h.iterator();i.hasNext();){
System.out.println(i.next());
}
}
@Override
public String toString() {
return "JiHeDemo [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
}
不同的人的年齡不一樣,我們通過(guò)hashcode復(fù)寫(xiě)計(jì)算不同的哈希值首繁,不同的哈希值代表不同的對(duì)象作郭,如果相同就不保存,這時(shí)再通過(guò)equals判斷它們的地址弦疮。
LinkeHashset:它沒(méi)有自己的方法夹攒,都是繼承hashset的方法。保證了存儲(chǔ)有序胁塞,并且對(duì)象唯一咏尝。