HashSet源码分析
2021/9/10 14:05:12
本文主要是介绍HashSet源码分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、HashSet简介
HashSet存储的是无序、不重复的对象。每组数据都没有索引,需要通过索引来进行操作的方法都没有,所以也不能使用普通for循环来进行遍历。存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取的。public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。
有四种构造函数
//默认构造函数,创建一个大小为16的容器,加载因子为0.75 public HashSet() { map = new HashMap<>(); }
// 带集合的构造函数 public HashSet(Collection<? extends E> c) { // 因为从HashMap的效率(时间成本和空间成本)考虑,HashMap的加载因子是0.75。 // 当HashMap的“阈值”(阈值=HashMap总的大小*加载因子) < “HashMap实际大小”时,就要将HashMap的容量翻倍。 // 所以,(c.size()/.75f) + 1 计算出来的正好是总的空间大小。 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); // 将集合(c)中的元素都添加到HashSet中 addAll(c); }
// 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); }
// 指定HashSet初始容量的构造函数 public HashSet(int initialCapacity) { map = new HashMap<E,Object>(initialCapacity); }
二、主要方法
2.1 add()方法
底层利用了HashMap键进行了元素的添加。
HashMap的put()方法中,该方法的返回值是对应HashMap中键值对中的值,
//如果当前列表中没有e则将e加进去 public boolean add(E e) { return map.put(e, PRESENT)==null; }
2.2 clear()方法
从set中移除所有元素。调用HashMap的clear方法清空所有元素。
public void clear() { map.clear(); }
2.3 remove()方法
如果指定元素存在于此set中,则将其移除。如果此set已包含该元素,则返回true。调用HashMap的remove方法删除指定Entry。
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value; }
2.4 contains()方法
底层实际调用HashMap的contains Key,判断是否包含指定key
public boolean contains(Object o) { return map.containsKey(o); }
2.5 iterator()方法
返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。调用底层HashMap的keySet来返回所有的key。public Iterator<E> iterator() { return map.keySet().iterator(); }
这篇关于HashSet源码分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27消息中间件底层原理资料详解
- 2024-11-27RocketMQ底层原理资料详解:新手入门教程
- 2024-11-27MQ底层原理资料详解:新手入门教程
- 2024-11-27MQ项目开发资料入门教程
- 2024-11-27RocketMQ源码资料详解:新手入门教程
- 2024-11-27本地多文件上传简易教程
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器