HashSet
存储自定义对象,保证元素的唯一性,要求两个对象的成员变量值相同,则为同一个元素
HashSet底层依赖的是hashCode()和equals()方法,方法没有重写,所以默认使用的事Object类,这时候哈希值是想通过的,执行添加。
执行顺序:首先比较哈希值是否相同,相同继续执行equal()方法,返回false才添加元素,不同就直接把元素添加到集合
哈希表:是一个元素为链表的数组。综合了数组和链表的好处(字典)
桶结构
LinkedHashSet:
底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性、链表保证元素有序
TreeSet:
排序有两种方式:自然排序、比较器排序
底层是二叉树结构。(红黑树是一种自平衡的二叉树)
存储进去:
第一个元素存储的时候,直接作为根节点存储。从第二个元素开始,每个元素从根节点开始比较
大 就作为右孩子
小 就作为左孩子
相等 就不搭理
取出来:
前序遍历、中序遍历、后序遍历
int num2 = num==0?this.name.compareTo(s.name):num;
要实现自然排序就需要implements Comparable<T>接口,排序取决于给出的排序条件,还要知道次要条件的更新
1、先实现接口2、写compareTo方法3、根据主要条件,再自己找次要条件
int num2 = num==0?this.name.compareTo(s.name):num;
int num3 = num2==0?this.age-s.age : num;
return num3;
比较器排序
public TreeSet(Comparator comparator)
TreeMap
TreeSet集合保证元素排序唯一性的原理
唯一性:是根据比较的返回是否是0来决定的
排序:
自然排序(元素具备比较性):让元素所属的类实现自然排序接口Comparable
比较器排序(集合具备比较性)让集合的构造方法接受一个比较器接口的子类对象Comparator
程序练习:
编写一个程序获取10个1-20的随机数,要求随机数不能重复(Set)
键盘录入5个学生信息(姓名,数学成绩,语文成绩,英语成绩),根据总分排名输出控制台
分析1、定义学生类2、创建一个TreeSet3、总分从高到低实现4、录入五个学生信息5、遍历TreeSet集合