HashSet的使用
Java 中的 HashSet 是 Collections Framework 中的一个类。 它允许您使用哈希表在集合中存储多个值。 哈希表借助哈希机制以无序的方式存储值。 导入 java.util.HashSet 包后,以下是在 Java 中创建 HashSet 的语法:
HashSet<data_type> name = new HashSet (capacity, loadFactor)
在上面的语法中:
Data_type:它是要存储在 HashSet 中的值的数据类型。
capacity:它是 HashSet 将存储的元素数。
loadFactor:它接受 0.00 到 1.00 之间的值。 假设 loadFactor 设置为 0.70,则 HashSet 的元素将被移动到另一个哈希表,一旦它被填充 70%,该哈希表的大小将是原来的两倍。
capacity 和 loadFactor 参数都是可选的。 如果您不提供参数,它将使用默认值初始化 HashSet。 现在我们已经了解了声明语法,让我们看看 HashSet 的一些基本特性。
HashSet 类层次结构
它扩展了 AbstractSet 类并实现了 Set 接口。 然后 set 接口进一步扩展了 Java HashSet 层次结构中的集合和可迭代接口。
HashSet 的一些最重要的特性包括:
- 允许空值
- 它使用散列机制存储元素
- 这是一个非同步类
- 使用哈希码插入和识别元素
- 只包含独特的元素
- 在搜索操作中最有用
- 默认容量和负载因子值分别为 16 和 0.75
- 它使用哈希表数据结构
HashSet 类的构造函数和方法
HashSet的不同构造函数
下面是用于构造和初始化 HashSet 的不同构造函数。
HashSet的不同方法
下面是用于在 HashSet 上执行各种选项的不同方法。
HashSetde 具体的一些方法
下面是具体代码实现:
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();//< >里面的就是泛型
//泛型是什么,操作集合里面的就是什么类型
//添加元素
set.add("小红");
set.add("小白");
set.add("小文");
set.add("小枭");
//获取元素个数
int size = set.size();
System.out.println("获取元素个数" + size);
//将newset1中所有的元素添加到set集合的中
HashSet<String> newSet1 = new HashSet<>();
Collections.addAll(newSet1, "aaa","bbb","cccc","ccc");//利用集合工具类(Collections)批量添加数据
set.addAll(newSet1);
//将newset2中所有的元素添加到set集合的指定位置
HashSet<String> newSet2 = new HashSet<>();
Collections.addAll(newSet2, "xxx","yyy","zzz","zzz","小光","小明","小强","小华");//利用集合工具类(Collections)批量添加数据
set.addAll(newSet2);
//清空集合
//set.clear();
System.out.println("判断集合是否包含某个元素:" + set.contains("王博文"));//true
System.out.println("判断集合中是否包含某个子集合:" + set.containsAll(newSet1));//true
//true表示没有元素,false表示有元素
System.out.println("判断集合中是否没有元素:" + set.isEmpty());//false
// set.remove("小白");//根据元素删除元素
// set.removeAll(newSet1);//去除交集
//
// set.retainAll(newSet1);//保留交集
//将集合转换为数组
Object[] array1 = set.toArray();
System.out.println(Arrays.toString(array1));
//将集合转换为指定类型的数组
String[] array2 = new String[set.size()];
set.toArray(array2);
System.out.println(Arrays.toString(array2));
System.out.println("--------------------------");
两种遍历方法
1.遍历集合 -- foreach
for (String element : set) {
System.out.println(element);
}
System.out.println("--------------------------");
2.遍历集合 -- Iterator
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){//判断是否有可迭代的元素
String next = iterator.next();//获取下一个元素
System.out.println(next);
}
注意
遍历出来的集合是无序的
理解无序:存入和取出的顺序不一致,无序不代表随机
HashSet的特点
1.无序的
2.不允许重复元素
3.允许使用null元素
4.线程不安全的
理解进入和出来的逻辑
存入顺序的逻辑:
1.获取元素的hash值 -- hashCode()
2.利用hash值计算出在数组中的下标
3.判断下标上是否有元素
3.1 没有元素 --就直接添加
3.2 有元素 -- 判断元素之间是否相同 -- 三个条件((hash) && (== || equals))
3.2.1 相同 -- 直接就不存,可以达到去重的效果
3.2.2 不同 -- 添加元素,JDK1.7 采用头插法,JDK1.8 采用尾插法
取出顺序的逻辑:
就是遍历数组,按存的顺序取出
LinkedHashSet的使用
LinkedHashSet的使用和HashSet相似
存入顺序的逻辑、取出顺序的逻辑--------双向链表
LinkedHashSet与HashSet异同:
相同:相同的存入顺序的逻辑、都有去重的作用
不同:
LinkedHashSet:有序
HashSet:无序
取出顺序的逻辑:LinkedHashSet从双向链表的头部开始遍历
HashSet直接遍历
LinkedHashSet是HashSet的子类,它的数据结构也是哈希表,只不过它的链表为双向链表,可以记录存储的顺序
标签:set,LInkedHashSet,HashSet,元素,System,特点,println,out From: https://blog.51cto.com/u_16154651/6495640