Set
Set是Collection的子接口,具有无序性,无重复的元素
Set是个接口,不能直接创建对象,需要实现类来创建对象
Set的实现类是HashSet,LinkedSet,TreeSet
HashSet
特点
- 元素唯一性
- 无序性
- 允许null存在且只有一个
- 不是线程安全
- 底层实现的数据结构是哈希表(哈希表依赖的两个方法:hashcode()和equals()方法)
(一般规则:对象的equals是true的话,hashcode需要相同,但是hashcode相同的对象不一定equals相同,这就是所谓的哈希冲突,但是有不同的解决方法。你的hashcode()方法设计的好就会减少冲突。)
public static void main(String[] args) {
/*
* set是无序的
* set的元素是不可重复的,如果重复了就会自动去掉
* set只能有一个null
* */
Set<String> set = new HashSet<>();
//给Set添加元素
set.add("张三");
set.add("李四");
set.add("王五");
set.add("赵六");
set.add("赵六");
set.add(null);
set.add("a");
set.add("c");
set.add("e");
set.add("b");
set.add("d");
set.add(null);
System.out.println(set);
}
LinkedHashSet
特点
- 元素唯一性
- 有序的
- 允许null存在且只有一个
- 不是线程安全(效率高)
- 底层数据结构由链表和哈希表组成
LinkedHashSet 和 HashSet来对比就是多了一个顺序。应用的不多
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("赵六");
set.add("赵六");
set.add(null);
set.add("a");
set.add("c");
set.add("e");
set.add("b");
set.add("d");
System.out.println(set);
}
TreeSet
特点
- 元素唯一性
- 可自定义排序的(两种 Comparable接口 自己定义比较类实现Comparator 比较器接口)
- 不允许null存在
- 不是线程安全
- TreeSet集合中的包装类都必须实现Comparable 接口
- 底层数据结构是红黑树。(是一种自平衡的二叉树)
import java.util.TreeSet;
public class SetTest2 {
public static void main(String[] args) {
// 创建一个 TreeSet 对象
TreeSet<Person> treeSet = new TreeSet<>();
// 添加 Person 对象
treeSet.add(new Person("孔明", 26));
treeSet.add(new Person("刘备", 28));
treeSet.add(new Person("关羽", 27));
treeSet.add(new Person("张飞", 25));
treeSet.add(new Person("张飞", 25)); // 注意:由于 TreeSet 自动去重,重复的元素不会被添加
// 遍历 TreeSet 并打印元素
for (Person person : treeSet) {
System.out.println(person);
}
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person other) {
// 按照年龄进行升序排序
return Integer.compare(this.age, other.age);
}
}