基本介绍
- 无序(添加,取出顺序不一致,但取出顺序固定),没有索引
- 去重,不允许重复元素,所以最多包含一个null
- 实现类:HashSet,TreeSet(常用的就这两个)
- 多用于快速查找,去重,数组集合等问题
常用方法
Set接口是Collection的子接口,常用方法和Collection相同
执行add方法后,实际上返回一个boolean值
遍历方式
- 可以使用迭代器
- 增强for循环
- 因为无序,所以不能用索引的方式来获取
@SuppressWarnings({"all"}) public class SetMethod { public static void main(String[] args) { Set set = new HashSet(); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add(null); set.add(null); for (int i = 0; i < 1; i++) { System.out.println(set); } //遍历方式 //1.迭代器 Iterator iterator = set.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); System.out.println("obj = " + obj); } //2.增强for循环 for (Object o : set) { System.out.println("o=" + o); } } }
HashSet
底层机制说明 0519 - 0524
- 同上,可存放空值,但只能存放一个(相同元素只能存放一个),单向链表
- 不保证存放元素的顺序与取出顺序一致
- 底层是HashMap
添加元素的底层 0522
- 先计算得到该元素的hash值,再转为索引值
- 找到存储数据表table,查看该索引位置是否已经存放元素
- 没有,直接加入
- 有,调用equals比较,若相同,放弃添加;若不同,添加到该索引值后方(以链表的形式添加)
练习
姓名,年龄相同,认为是同一个人
import java.util.HashSet;
import java.util.Objects;
public class HashSet_Exercise {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Employee("milan",18));
hashSet.add(new Employee("smith",18));
hashSet.add(new Employee("milan",18));
}
}
class Employee{
public String name;
public int age;
public Employee(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 "Employee{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age && Objects.equals(name, employee.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
关键在于hashcode和equals的重写
LinkedHashSet
HashSet的子类
底层是LinkedHashMap,底层维护了一个双向链表+数组
数据添加,取出顺序相同(依赖于双向链表 0528),不允许添加同样元素