set集合是collection下的接口,無序不重復。set中的方法與collection中的方法相同。
它的下面也有一些實現類
hashset類:它的底層是一個哈希表,當一個對象要在hashset中存放的時候,會拿這個對象根據算法算出它在數組中的位置。這個算法就是Object中的hashcode方法。
它的底層容量是16,當內存不夠是,以0.75倍增長。
給hashset存放對象時應該注意什么問題:
一定要根據對象的特有數據計算哈希值,并且通過equals方法進行比較。所以自定義對象所屬的類一定要對hashcode equals toString進行復寫。
hashset如何保證自定義對象的唯一:
自定義對象根據對象的特有數據計算哈希值,如果相同再在equals方法中比較如果返回true則兩對象有相同地址兩對象是同一個,不保存,如果哈希值相同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()
+ "]";
}
}
不同的人的年齡不一樣,我們通過hashcode復寫計算不同的哈希值,不同的哈希值代表不同的對象,如果相同就不保存,這時再通過equals判斷它們的地址。
LinkeHashset:它沒有自己的方法,都是繼承hashset的方法。保證了存儲有序,并且對象唯一。