Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方
法基本一致。
并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。
与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不
出现重复。
Set接口主要有两个实现类,分别是HashSet和TreeSet。
其中,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此
具有良好的存取和查找性能。
TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行
排序。
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素
都是无序的。
当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法
来计算对象的哈希值,从而确定元素的存储位置,如果此时哈希值相同,再调
用对象的equals()方法来确保该位置没有重复元素。
HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。
当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。
如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍
弃。
package test;
public class test1 {
private String name;
private Integer age;
public test1(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
System.out.println("equals");
if (this == obj) {
return true;
}
if (!(obj instanceof test1)) {
return false;
}
test1 ts = (test1) obj;
if (this.age.equals(ts.age) && this.name.equals(ts.name)) {
return true;
}
return false;
}
public int hashCode() {
System.out.println("hashcode");
return this.name.hashCode() | this.age.hashCode();
}
}
package test;
import java.util.HashSet;
public class test2 {
public static void main(String[] args) {
HashSet set=new HashSet();
set.add(new test1("Jack",20));
set.add(new test1("Rose",30));
set.add(new test1("Rose",30));
}
}
package test;
import java.util.HashSet;
import java.util.Iterator;
public class test3 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("aaa");
set.add("bbb");
set.add("ddd");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
package test;
import java.util.Set;
import java.util.TreeSet;
public class test4 {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(9);
set.add(6);
set.add(1);
set.add(4);
set.add(3);
for (Object object : set) {
System.out.println(object);
}
}
}