import java.util.HashSet;
import java.util.Set;
/**
- HashSet集合:无序,无索引,不可重复。
- HashSet不重复的原因:
-
--对于基本数据类型:直接比较是否相同重复。
-
--对于引用数据类型:
-
(1)首先会让两个对象调用hashCode()的方法来获取哈希值(所谓的内存地址:其实是一个整数),进行比较。如果两个哈希值不一样则认为两对象没有重复。
-
(2)如果两个哈希值不一样则进行equals比较,(重写equals()).
- 总结:Set系列集合元素去重复的原因。
-
----对于基本数据类型:Set集合可以直接进行比较是否重复。
-
----对于引用数据类型:Set集合先进行哈希值比较,再进行equals比较。
- Set系列集合无序的原因:根本原因是选择哈希表存放数据。
- 哈希表:
-
数组+链表+哈希算法组成,JDK1.8之前的形式。
-
数组+链表+红黑树+哈希算法组成。JDK1.8之后的形式,显著提高数据的查询性能。原因使用了红黑树。
*LinkedHashSet集合:有序,无索引,不可重复。
-
-----有序的原因:添加了一条链记录了添加顺序。
- */
public class Demo06_Day03_Set系列集合_HashSet的使用 {
public static void main(String[] args) {
//创建Set集合
Set<String>set=new HashSet<>();
//添加元素。
set.add("Java");
set.add("Python");
set.add("C++");
set.add("UI");
//打印集合。
System.out.println(set);
System.out.println("==============");
//Set集合不重复测试
//创建Set集合,存放基本数据类型。
Set<Double> set0=new HashSet<>();
//添加基本数据类型。
set0.add(20.0);
System.out.println(set0.add(20.0));
set0.add(20.0);
set0.add(23.2);
set0.add(21.3);
System.out.println(set0);
System.out.println("========================");
//创建Set集合,存放引用数据类型。
Set<Student> students=new HashSet<>();
Student stu0=new Student("张飞",20,'男');
Student stu1=new Student("关羽",22,'男');
Student stu3=new Student("张飞",20,'男');
//添加引用数据类型。
students.add(stu0);
students.add(stu1);
students.add(stu3);
System.out.println(students);
}
}
学生类:
public class Student {
private String name;
private int age;
private char sex;
@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 &&
sex == student.sex &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age, sex);
}
public Student() {
}
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}