Set接口简介
Set是不保存重复元素的Collection,Set接口只包含从Collection接口继承的方法,并且增加禁止重复元素的限制。实现Set接口的通用类是HashSet,LinkedHashSet,TreeSet类。
- HashSet类。HashSet采用hashCode算法存放元素,元素的存放顺序与插入顺序无关。HashSet是为了快速查找而实现的Set。由hashCode()和equals()方法保证唯一性。如果对象成员变量值相同即为同一个对象的话,需要重写hashCode()和equals()方法,通过ide可以自动生成。
- TreeSet类。TreeSet类采用红黑树数据结构(是一种自平衡的二叉树,避免层级过深)对元素排序(默认自然排序),是保证元素字母排列顺序的Set。它的查找速度比HashSet慢。根据比较的返回值是否是0来保证唯一性。有两种方式进行排序,1、元素具备比较性,让元素所属的类实现Comparable接口。2、集合具备比较性,让集合接收一个Comparator的实现类对象。
- LinkedHashSet类。LinkedHashSet是HashSet的子类,由哈希表和链表组成,哈希表保证元素的唯一性,链表保证取出与存储的顺序一致。
例子
- 获取10个1至20的随机数,要求随机数不能重复
/**
* 获取10个1至20的随机数,要求随机数不能重复。
* @author loveqRc
* */
public class RandomNum {
public static void main(String[] args) {
HashSet<Integer> hs=new HashSet<>();
Random rm=new Random();
while(hs.size()<10){
hs.add(rm.nextInt(20)+1);
}
for (Integer integer : hs) {
System.out.println(integer);
}
}
}
- 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
/**
* 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
*
* @author loveqRc
*
*/
public class StudentInfo {
public static void main(String[] args) {
System.out.println("请输入学生信息");
TreeSet<Student> students=new TreeSet<>();
for (int i = 0; i < 5; i++) {
Student student=new Student();
System.out.println("请输入第"+i+"个学生的名字");
Scanner scanner=new Scanner(System.in);
student.setName(scanner.nextLine());
System.out.println("请输入学生的语文成绩");
student.setChinese(Integer.valueOf(scanner.nextInt()));
System.out.println("请输入学生的数学成绩");
student.setMath(Integer.valueOf(scanner.nextInt()));
System.out.println("请输入学生的英语成绩");
student.setEnglish(Integer.valueOf(scanner.nextInt()));
students.add(student);
}
for (Student student : students) {
System.out.println(student.getName()+"的总分是:"+student.getTotal());
}
}
}
public class Student implements Comparable<Student> {
private Integer chinese;
private Integer english;
private Integer math;
private String name;
public Integer getChinese() {
return chinese;
}
public void setChinese(Integer chinese) {
this.chinese = chinese;
}
public Integer getEnglish() {
return english;
}
public void setEnglish(Integer english) {
this.english = english;
}
public Integer getMath() {
return math;
}
public void setMath(Integer math) {
this.math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotal(){
return this.chinese+this.math+this.english;
}
@Override
public int compareTo(Student s) {
return -(this.getTotal()-s.getTotal());
}
}