目录
一:Set接口概述
一个不包含重复元素的 collection。
注意:Set继承Collection接口,具有它所有的方法,由于它是接口不能实例化,要用接口多态实例化。
二:HashSet类概述
1:概述
不保证 set 的迭代顺序
特别是它不保证该顺序恒久不变。
2:HashSet如何保证元素唯一性
HashSet:此类实现Set接口,由哈希表(实际为HashMap实例)支持底层数据结构是哈希表(元素是链表的数组)。线程不安全,效率高。
通过观察源码发现,要想知道是否将元素插入到集合,先看元素的HashCode()值是否相同
如果相同,继续判断equals()方法
返回true,说明元素的内容一样,重复了,就不添加
返回false,说明元素的内容不重复,只是哈希值一样,就会添加集合中
如果连哈希值都不一样,就直接添加到集合中
由于String类重写了equals()方法,所以它这里比较的是内容,发现内容一样就不添加到集合
哈希表依赖于哈希值存储 添加功能底层依赖两个方法:
int hashCode()
boolean equals(Object obj)
三:例子
1:存储字符串并遍历
package day27;
import java.util.HashSet;
public class Test14 {
public static void main(String[] args) {
HashSet<String> strings = new HashSet<String>();//创建HashSet对象指定泛型为字符串
//添加元素
strings.add("hello");
strings.add("world");
strings.add("java");
strings.add("hadoop");
strings.add("world");
strings.add("java");
//增强for循环遍历集合strings并且输出
for (String string : strings) {
System.out.println(string);
}
}
}
2:存储自定义对象并遍历
package day27;
import java.util.Objects;
public class Student {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@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(age, name);
}
}
package day27;
import java.util.HashSet;
public class Test15 {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<Student>();
Student s1 = new Student(18, "小花");
Student s2 = new Student(17, "小明");
Student s3 = new Student(19, "小可");
Student s4 = new Student(20, "小良");
Student s5 = new Student(22, "小亮");
Student s6= new Student(19, "小花");
Student s7 = new Student(17, "小明");
//把学生对象添加到元素中
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
students.add(s5);
students.add(s6);
students.add(s7);
//增强for循环遍历获得学生姓名和年龄并输出
for (Student student : students) {
System.out.println(student.getName()+"**"+student.getAge());
}
}
}