HashSet
1.元素顺序: 元素唯一,但是无序。 2.如何保证元素的唯一性: 底层数据结构是哈希表。 哈希表依赖两个方法:hashCode()和equals()
执行流程: 首先判断哈希值是否相同,如果不同,就直接添加到集合。 如果相同,继续执行equals(),看其返回值, 如果是false,就直接添加到集合。 如果是true,说明元素重复不添加。 public static void main(String[] args) { //创建集合 HashSet<Student> hs = new HashSet<Student>(); //创建学生对象 Student s1 = new Student("a", 5); Student s2 = new Student("b", 4); Student s3 = new Student("c", 6); Student s4 = new Student("d", 7); Student s5 = new Student("a", 5); //给集合中添加元素 hs.add(s1); hs.add(s2); hs.add(s3); hs.add(s4); hs.add(s5); //遍历集合 for (Student student : hs) { System.out.println(student); } }输出结果为: Student [name=d, age=7] Student [name=c, age=6] Student [name=b, age=4] Student [name=a, age=5]
可见,元素无序和元素唯一两个特点。
TreeSet1.元素顺序: 使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序), 具体取决于使用的构造方法。 2。 底层算法: 二叉树
练习:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台,用比较器实现。
public static void main(String[] args) { System.out.println("请按格式输入学生信息:(姓名,语文成绩,数学成绩,英语成绩)"); Scanner sc = new Scanner(System.in); //创建TreeSet对象,使用比较器排序,使用匿名内部类重写方法 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int num=o2.getGrade()-o1.getGrade(); int num2=num==0?o1.getName().compareTo(o2.getName()):num; return num2; } }); //接收5次输入,并将信息加入到TreeSet for (int i = 0; i < 5; i++) { String next = sc.next(); String reg=","; String[] sp = next.split(reg); Student s = new Student(sp[0], Integer.parseInt(sp[1]), Integer.parseInt(sp[2]), Integer.parseInt(sp[3])); ts.add(s); } //遍历 for (Student student : ts) { System.out.println(student); } }HashSet与TreeSet的相同点与不同点 相同点: 单列集合,元素不可重复 不同点 1. 底层存储的数据结构不同 HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储 2.存储时保证数据唯一性依据不同 HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的 3.有序性不一样 HashSet无序,TreeSet有序