当前位置: 首页> 游戏> 单机 > 零基础学Java第二十天之HashSet集合详解

零基础学Java第二十天之HashSet集合详解

时间:2025/7/13 9:17:58来源:https://blog.csdn.net/qq_53720725/article/details/139127564 浏览次数:2次

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 {/*** 知识点:HashSet的使用*/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);//5HashSet<String> newSet1 = new HashSet<>();Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里//清空集合里所有的元素//set.clear();System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//falseSystem.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true//没有-true,有-falseSystem.out.println("判断集合里是否没有元素:" + set.isEmpty());//falseset.remove("水菜丽");//通过数据删除元素set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集)HashSet<String> newSet2 = new HashSet<>();Collections.addAll(newSet2, "麻生希","水菜丽","樱井步");set.retainAll(newSet2);//将set中有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("-----------------------------------------");//遍历集合 -- foreachfor (String element : set) {System.out.println(element);}System.out.println("-----------------------------------------");//遍历集合 -- IteratorIterator<String> it = set.iterator();while(it.hasNext()){//判断是否有可迭代的元素String next = it.next();//获取下一个元素System.out.println(next);}}
}

2、hashSet的特点

1、特点

  1. 不允许重复元素:当你尝试向 HashSet 中添加已存在的元素时,该元素不会被添加,并且 add() 方法会返回 false
  2. 无序性HashSet 不保证元素的顺序。每次迭代集合时,元素的顺序可能会不同。
  3. 基于 HashMap 实现HashSet 实际上使用 HashMap 来存储元素。在 HashSet 中,元素(通常称为“键”)的值是存储在 HashMapvalue 部分的一个常量对象(通常是 PRESENT,这是一个在 HashMap 类中定义的静态、不可变的对象)。由于 HashMap 的键是唯一的,因此 HashSet 中的元素也是唯一的。
  4. 迭代性能:虽然 HashSet 的查找和插入操作通常很快,但迭代整个集合可能需要 O(n) 的时间,其中 n 是集合中的元素数量。
  5. 线程不安全HashSet 不是线程安全的。如果你在多线程环境中使用它,并且至少有一个线程在结构上修改集合(即添加、删除或修改元素),那么必须在外部进行同步。这通常是通过在自然封装集合的对象上进行同步来实现的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装”集合。这最好在创建时完成,以防止对集合的意外非同步访问。
  6. 性能注意事项:由于 HashSet 使用哈希表来存储元素,因此元素的哈希码(hashCode() 方法的结果)对于性能至关重要。如果两个元素根据 equals(Object) 方法被视为相等,但它们的哈希码不同,那么 HashSet 将无法正常工作。因此,当你重写对象的 equals(Object) 方法时,你也应该重写其 hashCode() 方法,以确保它们的一致性。
  7. 空元素HashSet 允许添加 null 元素,但只能添加一个(因为 null 的哈希码总是相同的)。

2、案例

package com.qf.hashset_class;import java.util.HashSet;public class Test02 {/*** HashSet的特点* * 特点:无序且去重* * 添加步骤:* 		1.获取元素的hash值 -- hashCode()* 		2.通过hash值计算在数组中的下标* 		3.判断下标上是否有元素* 			3.1 没有元素 -- 直接添加* 			3.2 有元素 ---- 判断两个对象是否相同 hash && (==||equals())* 				3.2.1  相同 -- 不添加数据(达到去重效果)* 				3.2.2 不相同 -- 形成单向链表(JDK1.7头插法、JDK1.8尾插法)* * 遍历步骤:* 		遍历数组(顺序遍历)* * 注意:添加步骤处理数据的逻辑和遍历步骤处理数据的逻辑不一样,导致无序* * */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);}}
}
关键字:零基础学Java第二十天之HashSet集合详解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: