Java Set集合
Set是一种不包含重复元素的集合。它通常用于存储唯一的数据项。
Set接口的主要方法和特性
成员关系
add(E e): 添加指定的元素。如果set已经包含该元素,则返回false。
remove(Object o): 移除指定的元素。如果set不包含该元素,则返回false。
contains(Object o): 返回一个boolean值,指示set是否包含指定的元素。
isEmpty(): 返回一个boolean值,指示set是否为空。
子集关系
containsAll(Collection<?> c): 返回一个boolean值,指示set是否包含指定collection的所有元素。 addAll(Collection<? extends E> c): 添加指定collection中的所有元素。如果set已经包含这些元素,则返回false。 removeAll(Collection<?> c): 移除指定collection中的所有元素。
retainAll(Collection<?> c): 仅保留set中与指定collection中的元素相同的元素。
迭代
iterator(): 返回一个SetIterator,用于遍历set的元素。
toArray(): 返回一个包含set中所有元素的数组。
实现类
Set接口有多种实现类,包括:
HashSet: 使用散列算法实现的无序集合,可以存储任何类型的对象。
实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
非线程安全的
如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
LinkedHashSet: 使用散列算法实现的有序集合,可以存储任何类型的对象。它保留了元素的插入顺序。
TreeSet: 使用树结构实现的有序集合,可以存储任何类型的对象。它可以根据元素的自然顺序或者自定义的Comparator进行排序。
HashSet类
- 实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
- 非线程安全的
- 如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
- 如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable
HashSet常用方法
方法名 | 描述 |
---|---|
add(E e) | 添加指定的元素,如果set已经包含该元素,则返回false |
remove(Object o) | 移除指定的元素,如果set不包含该元素,则返回false |
contains(Object o) | 返回一个boolean值,指示set是否包含指定的元素 |
isEmpty() | 返回一个boolean值,指示set是否为空 |
size() | 返回set中的元素个数 |
iterator() | 返回一个Iterator,用于遍历set的元素 |
toArray() | 返回一个包含set中所有元素的数组 |
HashSet构造方法
构造方法 | 描述 |
---|---|
HashSet() | 创建一个具有默认初始容量(16)和默认加载因子(0.75)的新的空HashSet集合 |
HashSet(int initialCapacity) | 创建一个具有指定初始容量和默认加载因子(0.75)的新的空HashSet集合 |
HashSet(int initialCapacity, float loadFactor) | 创建一个具有指定初始容量和加载因子的新的空HashSet集合 |
HashSet(Collection<? extends E> c) | 创建一个包含指定集合中元素的新HashSet集合 |
注意:加载因子的值不宜过大或过小,过大会造成数组散列困难,从而使数组中存放了大量的元素,不宜数据的操作,而过小会造成数组散列频繁,从而造成内存空间的浪费。因此加载因子设为默认值(0.75)是效率最高的。
练习
public static void main(String[] args) {
/**
* 使用Set集合存储多个字符串,移除其中长度为奇数的字符串
*/
Set<String> set = new HashSet<>();
set.add("南");
set.add("北齐");
set.add("祺鑫");
set.add("七芒星");
set.add("北纬");
System.out.println("原:" + set);
//定义迭代器
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
//移除其中长度为奇数的字符串
if (str.length() % 2 != 0){
iterator.remove();
}
}
System.out.println("现:" + set);
}
TreeSet类
- 非线程安全
- 值必须可比较(元素实现 Comparable 接口、传递 比较器 Comparator 对象)
- 不能存 null
- 判断是否是重复元素,是按照自然比较/比较器进行比较
就是说a.compareTo(b) == 0,如果是 true ,那么 add(a) 之后的 add(b) 将会返回 false ,
也就是添加失败
练习
package com.kfm.JavaBase.Collection;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
public class Demo7 {
/**
* 使用集合统计一段文本中各个字符出现的次数
*/
public static void main(String[] args) {
// String str="南北启程弘石南北启程祺鑫";
String str="南北启程弘石南北启程祺鑫启程弘石南北启程祺鑫";
String[] charArry = str.split("");//以分隔字符
//将字符串 以 字符数组 放入 list 集合
List<String> list = Arrays.asList(charArry);
System.out.println(list);
//所有出现过的字符
HashSet<String> set = new HashSet<>(list);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String str1 = iterator.next();//不重复的所有元素
int count = 0;
Iterator<String> iterator1 = list.iterator();
while (iterator1.hasNext()){
String c = iterator1.next();//全部元素
if (str1.equals(c)){//若不重复的元素与全部元素 有相等元素 则说明这个字符 出现不止一次 出现几次 就重复了几次
count++;
}
}
System.out.println(str1 + "出现了" + count + "次");
}
}
}
package com.kfm.JavaBase.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Exer7 {
public static void main(String[] args) {
/**
* 使用Set集合存储多个字符串,移除其中长度为奇数的字符串
*/
Set<String> set = new HashSet<>();
set.add("南");
set.add("北齐");
set.add("祺鑫");
set.add("七芒星");
set.add("北纬");
System.out.println("原:" + set);
//定义迭代器
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
//移除其中长度为奇数的字符串
if (str.length() % 2 != 0){
iterator.remove();
}
}
System.out.println("现:" + set);
}
}
TreeSet常用方法
以下的图表展示了TreeSet常用方法:
方法名 | 描述 |
---|---|
add(E e) | 添加指定的元素到TreeSet中 |
clear() | 清空TreeSet中的所有元素 |
contains(Object o) | 判断TreeSet中是否包含指定元素 |
first() | 返回TreeSet中的第一个元素 |
last() | 返回TreeSet中的最后一个元素 |
remove(Object o) | 从TreeSet中移除指定元素 |
size() | 返回TreeSet集合中包含的元素个数 |
iterator() | 返回一个Iterator,用于遍历TreeSet的元素 |
toArray() | 返回一个包含TreeSet中所有元素的数组 |
TreeSet构造方法
以下是TreeSet构造方法的表格:
构造方法 | 描述 |
---|---|
TreeSet() | 创建一个新的空TreeSet集合,利用默认的Comparator进行排序 |
TreeSet(Comparator<? super E> c) | 创建一个新的空TreeSet集合,利用指定的Comparator进行排序 |
TreeSet(Collection<? extends E> c) | 创建一个新的TreeSet集合,包含指定Collection中的元素,排序规则由传入的Comparator决定 |
注意:如果你想要创建一个基于自然顺序的TreeSet,你可以使用不带参数的构造方法。如果你想要创建一个基于自定义顺序的TreeSet,你可以传入一个实现了Comparator接口的对象。