概论
- Set集合继承了AbstractCollection集合,它的核心特点是没有重复元素,无序。
- TreeSet集合(红黑树),在没有重复元素的基础上,还能够将元素进行排序储存。
Set
我将通过典型的HashSet来了解Set的特性。HashSet实现Set的方式是通过Hash表确保元素的唯一性。而Hash表中,又将分别进行两个动作来判断将要储存的元素是否唯一。
- *hashCode()*方法
- equals() 方法
在往HashSet内添加值时,会分别进行以上两个步骤。HashSet允许储存:
- 与现有元素集哈希值不同的元素
- 与现有元素集哈希值相同,但是 equals() 返回false的元素。
除了以上两种元素,其他元素都会被拒之门外。
因此,在使用HashSet储存对象时,我们需要重写对象的这两个方法,以便满足我们对储存对象数据唯一性的要求。
HashSet例子:
在这个例子中,我写了一个Band类,在这个类中,有三个内部变量:name,style,rate, 在判断HashCode上,我选择用name和rate判断,在equals上,我选择name和style判断。
class Band implements {
private String name;
private String style;
private int rate;
Band() {
}
public Band(String name, String style, int rate) {
this.name = name;
this.style = style;
this.rate = rate;
}
public String getName() {
return this.name;
}
public String getStyle() {
return this.style;
}
public int getRate() {
return this.rate;
}
public void setRate(int rate) {
this.rate = rate;
}
@Override
public int hashCode() {
System.out.println(this.toString() + "'s hashCode: " + this.name.hashCode() + this.rate * 37);
return this.name.hashCode() + this.rate * 37;
}
@Override
public boolean equals(Object obj) {
System.out.println(this + "---equals---" + obj);
if (obj instanceof Band) {
Band bd = (Band)obj;
return this.name.equals(bd.name) && this.style.equals(bd.style);
} else {
return false;
}
}
@Override
public String toString() {
return "Band@name: " + this.name + " style: " + this.style + " rate: " + this.rate;
}
}
在主方法中,我们来尝试一下HashSet判断一致性的过程:
public static void main(String[] args) {
HashSet<Band> hs = new HashSet<Band>();
hs.add(new Band("Smashing Pumpkins", "Rock", 99));
hs.add(new Band("Smashing Pumpkins", "Rock", 98));
hs.add(new Band("Smashing Pumpkins",