HashSet详解
1、详解
HashSet
是 Java 集合框架(Java Collections Framework)中的一个核心类,它实现了 Set
接口。与 List
不同,Set
不允许包含重复的元素。HashSet
的内部实现基于 HashMap
,它提供了快速的插入和查找操作,其时间复杂度通常接近 O(1)(在平均情况下)。
package com.xx.hashset_class;import java.util.HashSet;import java.util.Arrays;import java.util.Collections;import java.util.Iterator;public class Test01 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("麻生希");set.add("椎名空");set.add("水菜丽");set.add("朝桐光");set.add("樱井步");int size = set.size();System.out.println("获取元素个数:" + size);HashSet<String> newSet1 = new HashSet<>();Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");set.addAll(newSet1);System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));System.out.println("判断集合里是否没有元素:" + set.isEmpty());set.remove("水菜丽");set.removeAll(newSet1);HashSet<String> newSet2 = new HashSet<>();Collections.addAll(newSet2, "麻生希","水菜丽","樱井步");set.retainAll(newSet2);Object[] array1 = set.toArray();System.out.println(Arrays.toString(array1));String[] array2 = new String[2];set.toArray(array2);System.out.println(Arrays.toString(array2));System.out.println("-----------------------------------------");for (String element : set) {System.out.println(element);}System.out.println("-----------------------------------------");Iterator<String> it = set.iterator();while(it.hasNext()){String next = it.next();System.out.println(next);}}
}
2、hashSet的特点
1、特点
- 不允许重复元素:当你尝试向
HashSet
中添加已存在的元素时,该元素不会被添加,并且 add()
方法会返回 false
。 - 无序性:
HashSet
不保证元素的顺序。每次迭代集合时,元素的顺序可能会不同。 - 基于 HashMap 实现:
HashSet
实际上使用 HashMap
来存储元素。在 HashSet
中,元素(通常称为“键”)的值是存储在 HashMap
的 value
部分的一个常量对象(通常是 PRESENT
,这是一个在 HashMap
类中定义的静态、不可变的对象)。由于 HashMap
的键是唯一的,因此 HashSet
中的元素也是唯一的。 - 迭代性能:虽然
HashSet
的查找和插入操作通常很快,但迭代整个集合可能需要 O(n) 的时间,其中 n 是集合中的元素数量。 - 线程不安全:
HashSet
不是线程安全的。如果你在多线程环境中使用它,并且至少有一个线程在结构上修改集合(即添加、删除或修改元素),那么必须在外部进行同步。这通常是通过在自然封装集合的对象上进行同步来实现的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet
方法来“包装”集合。这最好在创建时完成,以防止对集合的意外非同步访问。 - 性能注意事项:由于
HashSet
使用哈希表来存储元素,因此元素的哈希码(hashCode()
方法的结果)对于性能至关重要。如果两个元素根据 equals(Object)
方法被视为相等,但它们的哈希码不同,那么 HashSet
将无法正常工作。因此,当你重写对象的 equals(Object)
方法时,你也应该重写其 hashCode()
方法,以确保它们的一致性。 - 空元素:
HashSet
允许添加 null
元素,但只能添加一个(因为 null
的哈希码总是相同的)。
2、案例
package com.qf.hashset_class;import java.util.HashSet;public class Test02 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("aaa");set.add("bbb");set.add("ccc");set.add("ccc");set.add("Aa");set.add("BB");for (String element : set) {System.out.println(element);}}
}