1.HashSet
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,
然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
HashSet 集合判断两个元素相等的标准:
两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
结论:HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
@Override
public int hashCode() {
// return 0;
// 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
// return this.name.hashCode() + this.age;
// 看下面
//s1:name.hashCode()=40,age=30
//s2:name.hashCode()=20,age=50
//尽可能的区分,我们可以把它们随变乘以一些整数
return this.name.hashCode() + this.age * 15;
}
// @Override
// public boolean equals(Object obj) {
// // System.out.println(this + "---" + obj);
// if (this == obj) {
// return true;
// }
//
// if (!(obj instanceof Student)) {
// return false;
// }
//
// Student s = (Student) obj;
// return this.name.equals(s.name) && this.age == s.age;
// }
//
// @Override
// public String toString() {
// return "Student [name=" + name + ", age=" + age + "]";
// }
public static void main(String[] args) {
// TreeSet:底层数据结构是二叉树,元素唯一,且能对元素进行排序。
/* 存储下列元素:
20, 18, 23, 22, 17, 24, 19, 18, 24*/
//自然排序:要求元素实现Comparable这个接口重写compareTo()方法,根据比较的方法返回值的正负0 来决定元素在二叉树中放置的位置
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(20);
treeSet.add(18);
treeSet.add(23);
treeSet.add(22);
treeSet.add(17);
treeSet.add(24);
treeSet.add(19);
treeSet.add(29);
treeSet.add(18);
treeSet.add(24);
for (Integer integer : treeSet) {
System.out.println(integer);
}
//Integer类实现了Comparable这个接口,重写了 compareTo
/* public int compareTo (Integer anotherInteger){
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
*/
}
public static void main(String[] args) {
//TreeSet集合对元素进行排序,有两种排序方式,
//方式1:叫做自然排序,当你使用空参构造时,用的就是自然排序
/*
* 如果用自然排序:自然排序对元素有要求,要求元素必须实现一个 Comparable 接口 重写这个接口中的compareTo()这个比较的方法
* 根据这个比较的方法的返回值的正负0 来决定元素的在二叉树中的放到位置,以及往不往里面放
* */
//方式2:叫做比较器排序
//使用自然排序:来排序学生对象,根据学生的年龄大小 来排序
TreeSet<Student> treeSet = new TreeSet<>();
treeSet.add(new Student("张三",33));
treeSet.add(new Student("李四", 24));
treeSet.add(new Student("王五", 38));
treeSet.add(new Student("赵六", 26));
treeSet.add(new Student("张三", 33));
treeSet.add(new Student("张三", 33));
treeSet.add(new Student("王老五", 33));
`` for (Student student : treeSet) {
System.out.println(student.getName()+"==="+student.getAge());
}
}`