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的方法。保证了存储有序,并且对象唯一。