实现类HashSet
//******************************在HashSet中添加自定义的对象
public class Student {
private int age;
private String name;
//省略了相应的get/set方法
public Student(int age,String name){
this.age = age;
this.name = name;
}
//要显示Student类的信息,必须重写toString方法
public String toString(){
return "age:"+age+"name:"+name;
}
//在Java规范要求中,如果用户重写了equals()方法,就一定要重写hashCode()方法
//两个对象进行equals比较时,如果返回true,那么他们的hashCode要求返回相等的值。
public int hashCode(){
return age*name.hashCode();
}
//HashSet中加入的对象需要重写hashCode()和equals()方法
@Override
public boolean equals(Object obj) {
Student s = (Student)obj; //类型转化
return age==s.age && name.equals(s.name);
}
}
注解:
因为Set集合中不能加入重复的元素,所以对于自定义类,需要提供判断怎样才算重复元素的方法。代码中的hashCode()和equals()方法即是用来判断Student对象是否为重复对象的标准方法。如果两个对象相同,那么他们的hashCode值就一定相同。
import java.util.HashSet;
import java.util.Iterator;
public class SelfHashSetTest {
public static void main(String args[]){
HashSet hs = new HashSet();
//添加自定义对象
hs.add(new Student(28,"zah"));
hs.add(new Student(31,"xmh"));
hs.add(new Student(30,"zyj"));
//添加重复元素
hs.add(new Student(28,"zah"));
hs.add(new Student(31,"xmh"));
//添加null元素
hs.add(null);
hs.add(null);
//用迭代器进行访问输出
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果
null
age:31name:xmh
age:33name:zxx
age:30name:zyj
age:28name:zah
由运行结果可得出,HashSet允许添加null元素,但对于重复的元素,只能添加一个。
实现类LinkedHashSet
LinkedHashSet类根据元素的哈希吗进行存放,同时用链表记录元素的加入顺序。
public class Student {
private int age;
private String name;
//省略了相应的get/set方法
public Student(int age,String name){
this.age = age;
this.name = name;
}
//要显示Student类的信息,必须重写toString方法
public String toString(){
return "age:"+age+"name:"+name;
}
//在Java规范要求中,如果用户重写了equals()方法,就一定要重写hashCode()方法
//两个对象进行equals比较时,如果返回true,那么他们的hashCode要求返回相等的值。
public int hashCode(){
return age*name.hashCode();
}
//HashSet中加入的对象需要重写hashCode()和equals()方法
@Override
public boolean equals(Object obj) {
Student s = (Student)obj; //类型转化
return age==s.age && name.equals(s.name);
}
}
import java.util.Iterator;
import java.util.Set;
import java.util.LinkedHashSet;
public class LinkedHashSetTest {
public static void main(String args[]){
Set<Student> linkHashSet = new LinkedHashSet<Student>();
Student stu1 = new Student(18,"zxx");
Student stu2 = new Student(23,"zyj");
Student stu3 = new Student(25,"xmh");
Student stu4 = new Student(25,"zah");
Student stu5 = new Student(25,"zah");
linkHashSet.add(stu3);
linkHashSet.add(stu4);
linkHashSet.add(stu1);
//记录HashCode码顺序,按照顺序查找出来
linkHashSet.add(stu2);
linkHashSet.add(stu5);
linkHashSet.add(null);
Iterator it = linkHashSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果
age:25name:xmh
age:25name:zah
age:18name:zxx
age:23name:zyj
null
Process finished with exit code 0
注:
通过链表来存储对象,一般插入和删除效率较高,检索效率相对较低。
实现类TreeSet
public class Student1 {
private Integer age;
private String name;
private Integer score;
Student1(int age,String name,int score){
this.age = age;
this.name = name;
this.score = score;
}
public String toString(){
return "age:"+age+"name:"+name+"score:"+score;
}
public int hashCode(){
return age*name.hashCode();
}
public boolean equals(Object o){
Student1 s = (Student1)o;
return age==s.age && name.equals(s.name);
}
public int getAge() {
return age;
}
public Integer getScore() {
return score;
}
}
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
//学生年龄比较器class
class StudentAgeComparetor implements Comparator<Student1> {
@Override
public int compare(Student1 o1, Student1 o2) {
int i = o2.getAge()-o1.getAge();
return i;
}
}
//学生分数比较器class
class StudentScoreComparator implements Comparator<Student1> {
@Override
public int compare(Student1 o1, Student1 o2) {
int i = (int) (o2.getScore()-o1.getScore());
return i;
}
}
public class SelfTreeSetTest {
public static void main(String args[]){
//创建TreeSet对象时选择比较器
Set ts = new TreeSet(new StudentAgeComparetor());
Student1 stu1 = new Student1(18,"zxx",85);
Student1 stu2 = new Student1(23,"zyj",81);
Student1 stu3 = new Student1(26,"xmh",92);
Student1 stu4 = new Student1(25,"zah",76);
ts.add(stu3);
ts.add(stu4);
ts.add(stu1);
ts.add(stu2);
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果
age:26name:xmhscore:92
age:25name:zahscore:76
age:23name:zyjscore:81
age:18name:zxxscore:85
Process finished with exit code 0
注:
若选择分数选择器,则把代码Set ts = new TreeSet(new StudentAgeComparetor())改为
Set ts = new TreeSet(new StudentScoreComparetor())就可以了。