1、Set集合的特点
一个不包含重复元素的collection
2、HashSet是如何保证元素唯一性的?
HashSet 底层数据结构是哈希表.,HashSet 不是线程安全的,集合元素可以是 null,其中哈希表是一个元素加数组的数据结构
基本过程可简述为当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值, 然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
3、TreeSet是如何保证元素唯一性和排序的?
基本过程可简述为先存入一个树根,分两个叉,存储元素时跟树根比较,小的放在左边,大的放在右边,如果相等就不存储,取的时候按照“左中右”的顺序来取
保证元素的唯一性是靠compareTo方法的返回值来确定,如果返回0,表示两个元素相等,则不重复存储
@Override
public int compareTo(Student o) {
int num = this.name.length() - o.name.length();
int num2 = num == 0 ? this.name.compareTo(o.name) : num;
int num3 = num2 == 0 ? this.age - o.age : num;
return num3;
}
4、代码实例
A:请编写程序,存储自定义对象到HashSet集合中,并遍历
package org.zhang15.demo;
import java.util.Objects;
/**
* @Author: goodboy
* @CreateTime: 2019-01-12 21:40
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package org.zhang15.demo;
import java.util.HashSet;
/**
* @Author: goodboy
* @CreateTime: 2019-01-12 21:40
*/
public class Demo1 {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("小张",12));
students.add(new Student("小王", 13));
students.add(new Student("小李", 14));
students.add(new Student("小王", 13));
students.add(new Student("小赵", 15));
for (Student student : students) {
System.out.println(student.toString());
}
}
}
B:请编写程序,存储自定义对象到TreeSet集合中,并遍历
package org.zhang15.demo;
import java.util.Objects;
/**
* @Author: goodboy
* @CreateTime: 2019-01-12 21:40
*/
//采用自然排序方式
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
int sum1 = this.age-o.age;
int sum2 = sum1==0?this.name.compareTo(o.name):sum1;
return sum2;
}
}
package org.zhang15.demo;
import java.util.TreeSet;
/**
* @Author: goodboy
* @CreateTime: 2019-01-12 21:57
*/
public class Demo2 {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>();
students.add(new Student("小明",12));
students.add(new Student("小宋", 14));
students.add(new Student("小张", 11));
students.add(new Student("小明", 15));
students.add(new Student("小明", 12));
for (Student student : students) {
System.out.println(student.toString());
}
}
}