Set接口实现类

实现类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())就可以了。

猜你喜欢

转载自blog.csdn.net/gfjserhukher/article/details/82715662
今日推荐