1、Java HashSet
HashSet
实现了Set
接口,它不允许集合中有重复的值,当将对象存储在HashSet
之前,要先确保对象重写equals()
和hashCode()
方法,这样才能比较对象的值是否相等,以确保set
中没有储存重复的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。
例如:
创建一个名为langs的HashSet对象,该对象将存储字符串:
import java.util.HashSet; // 导入HashSet
HashSet<String> langs = new HashSet<String>();
2、访问HashSet中的元素
HashSet
类具有许多有用的方法。 例如,要向其中添加元素,请使用add()
方法:
例如:
// 导入HashSet
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<String> langs = new HashSet<String>();
langs.add("c");
langs.add("java");
langs.add("python");
langs.add("cjavapy");
langs.add("javascript");
System.out.println(langs);
}
}
注意:集合中的每个元素都必须是唯一的。
3、判断HashSet中的元素
要判断HashSet
中是否存在某个元素,请使用contains()
方法:
例如:
langs.contains("cjavapy");
4、删除HashSet中的元素
要删除元素,请使用remove()
方法:
例如:
langs.remove("cjavapy");
要删除所有元素,请使用clear()
方法:
例如:
langs.clear();
5、HashSet size
要找出有多少个元素,需要使用size
方法:
例如:
langs.size();
6、循环遍历HashSet中的元素
通过for-each循环遍历HashSet
的元素:
例如:
for (String i : langs) {
System.out.println(i);
}
7、其它类型
HashSet
中的项目实际上是对象。在上面的示例中,我们创建了 项目 (对象)类型为字符串。Java中的String
是一个对象(不是原始类型)。要使用其他类型,例如int
,必须指定等效的包装类:Integer
。对于其他基本类型,请使用:Boolean
表示布尔值,Character
表示char
,Double
表示double
,等等。
基本类型对应的包装类表如下:
基本类型 | 引用类型 |
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
例如:
使用存储Integer
对象的HashSet
:
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
// 创建HashSet对象
HashSet<Integer> numbers = new HashSet<Integer>();
// 添加
numbers.add(4);
numbers.add(5);
numbers.add(8);
// 判断指定值是否包含
for(int i = 1; i <= 10; i++) {
if(numbers.contains(i)) {
System.out.println(i + " 存在numbers中");
} else {
System.out.println(i + " 存在numbers中");
}
}
}
}
8、HashMap和HashSet的区别
HashMap
和 HashSet
都是 Java 中常用的集合类,都是基于哈希表(HashTable
)实现的,但它们有不同的使用场景和行为。
1)接口实现
HashMap
实现了 Map
接口,是一个键值对集合,用于存储键值对(key-value
)。每个元素都有一个唯一的键(key
)和对应的值(value
)。
HashSet
实现了 Set
接口,用于存储不重复的元素(没有键和值,只有元素)。HashSet
的元素没有顺序。
2)数据存储
HashMap
存储的是键值对(key-value
),其中每个 key
唯一,value
可以是重复的。
HashSet
存储的是单独的元素,没有键值对,元素必须是唯一的。
3)元素访问
HashMap
通过 key
来访问对应的 value
。可以通过 get(key)
方法获取值,或者通过 containsKey(key)
判断是否包含某个键。
HashSet
只存储元素,只能判断某个元素是否存在,而不能像 HashMap
那样使用 key
来查找对应的值。
4)使用场景
HashMap
用于存储键值对的映射关系,当你需要根据某个 key
查找或操作对应的 value
时,使用 HashMap
。例如:缓存、字典、存储配置信息等。
HashSet
用于存储一组不重复的元素,当你只关心元素是否存在,而不需要存储额外的值时,使用 HashSet
。例如:去重、集合运算、元素存在性判断等。
5)线程安全
HashMap
不是线程安全的。如果多个线程并发访问并修改一个 HashMap
,可能会导致数据不一致。可以使用 Collections.synchronizedMap
来使其线程安全,或者使用 ConcurrentHashMap
。
HashSet
本身也不是线程安全的。如果需要线程安全,可以使用 Collections.synchronizedSet
来使其线程安全,或者使用 CopyOnWriteArraySet
。