哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java开发中,集合框架是非常重要的一部分,集合框架为Java提供了一种方式来管理和组织数据。其中HashSet是集合框架中的一种重要实现方式,它提供了一种存储集合元素的无序且唯一的方式。
摘要
本文将介绍HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。通过本文的学习,读者将会具备使用HashSet的能力,同时了解HashSet的优势和限制。
HashSet
简介
HashSet是Java集合框架中的一种Set接口的实现。与List集合不同,Set集合中没有重复元素,HashSet提供了一种高效的无序存储方式,可以存储不同类型的数据,包括数字,字符串,对象和集合等。
HashSet使用哈希表作为存储数据的方式,底层实现是HashMap,每个元素在HashSet中都有一个对应的Key和Value。当添加一个元素到HashSet中时,HashSet会根据元素的hashCode()方法值计算出对应的Key,再将元素加入到HashMap中。如果已存在相同Key的元素则会被覆盖,因此HashSet中不会存在重复元素。
HashSet的基本操作包括添加元素、删除元素、判断元素是否存在、遍历元素等。
源代码解析
以下是HashSet的源代码解析:
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable
{
// 底层实现为HashMap
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
// 构造函数
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public void clear() {
map.clear();
}
public int size() {
return map.size();
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>)super.clone();
newSet.map = (HashMap<E,Object>)map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
private void writeObject(ObjectOutputStream s)
throws IOException {
s.defaultWriteObject();
s.writeInt(map.capacity());
s.writeFloat(map.loadFactor());
s.writeInt(map.size());
for (E e : map.keySet())
s.writeObject(e);
}
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
int capacity = s.readInt();
if (capacity < 0) {
throw new InvalidObjectException("Illegal capacity: " +
capacity);
}
float loadFactor = s.readFloat();
if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
throw new InvalidObjectException("Illegal load factor: " +
loadFactor);
}
int size = s.readInt();
if (size < 0) {
throw new InvalidObjectException("Illegal size: " +
size);
}
map = new HashMap<>(capacity, loadFactor);
for (int i=0; i<size; i++) {
E e = (E) s.readObject();
map.put(e, PRESENT);
}
}
}
如下是部分源码截图:
应用场景案例
HashSet的应用场景比较广泛,例如:
- 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。
- 缓存管理:可以使用HashSet来存储缓存对象,以提高缓存查找效率。
- 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。
优缺点分析
HashSet的优点有:
- 存储快速:HashSet使用哈希表作为底层存储结构,可以快速存储和查找元素。
- 去重:HashSet中不会存在重复元素,可以用于数据去重。
- 线程不安全:HashSet是线程不安全的,不适合在多线程环境中使用。
HashSet的缺点有:
- 无序性:HashSet中的元素是无序的,不能按照特定的顺序进行操作。
类代码方法介绍
以下是HashSet类的常用方法介绍:
add(E e)
:将元素添加到HashSet中。remove(Object o)
:将元素从HashSet中删除。contains(Object o)
:判断元素是否存在于HashSet中。clear()
:清空HashSet中的所有元素。size()
:返回HashSet中元素的数量。iterator()
:返回一个迭代器,可以遍历HashSet中的所有元素。
测试用例
以下是使用HashSet的测试用例:
测试代码演示
package com.example.javase.collection;
import java.util.HashSet;
/**
* @Author ms
* @Date 2023-10-21 21:05
*/
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
System.out.println(set.add("Hello"));
System.out.println(set.add("World"));
System.out.println(set.add("Hello"));
System.out.println(set.remove("Hello"));
System.out.println(set.remove("Hello"));
System.out.println(set.contains("Hello"));
System.out.println(set.contains("World"));
set.clear();
System.out.println(set.size());
set.add("Hello");
set.add("World");
System.out.println(set.size());
StringBuilder sb = new StringBuilder();
for (String s : set) {
sb.append(s);
}
System.out.println(sb.toString());
}
}
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
测试代码分析
该代码演示了 HashSet
的基本用法。
首先在 main
方法中创建一个空的 HashSet
对象 set,并向其中添加两个字符串 “Hello” 和 “World”。添加第一个元素 “Hello” 时返回 true,添加第二个元素 “World” 时返回 true,再添加第一个元素 “Hello” 时返回 false,因为 HashSet
不允许添加重复元素。
接着,使用 remove
方法尝试删除元素 “Hello”,第一次删除成功并返回 true,第二次删除失败并返回 false,因为元素 “Hello” 已经被删除了。
contains
方法用来判断元素是否存在于 HashSet 中,第一次查询元素 “Hello” 时返回 false,因为元素已经被删除,第二次查询元素 “World” 时返回 true,因为元素仍然存在。
clear 方法将 HashSet
中的所有元素清空,使其变为空集合,因此调用 set.size()
方法返回 0。
set.add
方法可以用于添加元素,再次添加元素 “Hello” 和 “World” 之后调用 set.size()
方法返回 2。
最后使用 for-each
循环遍历 HashSet
中的元素,将每个元素拼接在一起后输出。因为 HashSet 是无序的,因此输出的字符串也是无序的。
全文小结
本文介绍了HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。HashSet是Java集合框架中的一种重要实现方式,提供了一种高效的无序存储方式,可以用于数据去重、缓存管理等场景。同时,HashSet是线程不安全的,需要注意使用。
总结
HashSet是Java集合框架中的一种重要实现方式,具有存储快速、去重等优点,同时也存在一些缺点,例如无序性和线程不安全性。在实际的开发中,需要充分考虑应用场景和需求,选择合适的集合实现方式。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。