一、目录
- Set接口基本介绍
- HashSet基本介绍
- HashSet题目练习
- LinkedHashSet介绍
二、Set接口基本介绍
- 无序(添加和取出顺序不一致,但是它是固定的),没有索引。
- 不允许重复元素,所以最多包含一个null。
- Set接口中常用的实现类有HashSet和TreeSet。
package com.javaCollection;
import java.util.HashSet;
import java.util.Iterator;
public class javaHashSet {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(null);
hashSet.add("wang");
hashSet.add("zhang");
hashSet.add(10);
hashSet.add("Li");
hashSet.add(null);
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
null
wang
10
zhang
Li
三、HashSet基本介绍
- HashSet实现了Set接口。
- HashSet实际上是HashMap。(HashMap的底层是数组+链表+红黑树)
public HashSet() {
map = new HashMap<>();
}
- 可以存放null值,但是只能有一个null。
- HashSet不保证元素是有序的,取决于hash后,再确定索引的结果。
- 不能有重复元素。
四、HashSet题目练习
定义一个Employee类,该类包含:private成员属性name,age 要求:
- 创建3个Employee放入HashSet中。
- 当name和age的值相同时,认为是相同员工,不能添加到HashSet集合中。
package com.javaCollection;
import java.util.HashSet;
import java.util.Objects;
public class javaHashSet {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Employee("P", 31));
hashSet.add(new Employee("M", 10));
hashSet.add(new Employee("P", 31));
System.out.println(hashSet);
}
}
class Employee{
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
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);
}
}
[Employee{name='P', age=31}, Employee{name='M', age=10}]
这里需要重写一下hashcode和equals方法,idea已经都重写好了。
五、LinkedHashSet介绍
- LinkedHashSet是HashSet的子类。
- LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表。
- LinedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
- LinkedHashSet不允许添加重复元素。