HashSet
底层的数据结构是数组和单向链表。
特点:
- 元素是无序的,存取时没有顺序。Hash 算法是一种散列算法,具有幂等性。
- 元素不会重复。
HashSet 判断元素是否重复的逻辑如下:
- 先对比元素的内存地址(hashCode)是否相同,如果不同,就根据哈希散列算法,映射到数组中的不同位置。
- 如果内存地址相同,再使用 equals 方法比较它们的值,如果不同,就进行存储,并用链表关联它们。如果还相同,就直接丢弃。
因此,可以通过重写元素对象的类的 hashCode 方法和 equals 方法,来影响 HashSet 中元素是否重复的判断逻辑。
HashSet 修改数据时,需要先删除,再添加。
示例
HashSet set = new HashSet();
set.add("jack");
set.add("jack"); // 可以写,但不起作用
set.add("rose");
set.add("lily");
System.out.println(set); // [lily, rose, jack]
// 删除数据
set.remove("lily");
// 再新增
set.add("neil");
System.out.println(set); // [neil, rose, jack]
// 遍历数据
for (Object e : set) {
System.out.println("容器中的元素:" + e);
}
// 获取容器的容量
System.out.println(set.size()); // 3