哈喽,各位小伙伴们,你们好呀,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
如下是Java集合体系架构图,近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。
在Java开发中,集合框架是非常重要的一部分,集合框架为Java提供了一种方式来管理和组织数据。其中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类的常用方法介绍:
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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。