HashSet源码探讨(基于JDK1.8)
来源:互联网 发布:君临天下青囊师数据 编辑:程序博客网 时间:2024/05/21 05:57
HashSet 简介
如果对HashMap没有了解,应该先学习HashMap再学习HashSet 。
HashSet结构
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
HashSet 是一个没有重复元素的集合,它其实是由HashMap实现的,HashMap中保存的是键值对,然而我们只能向HashSet中添加key,原因在于
HashSet的Value其实都是同一个对象,这是HashSet添加元素的方法,可以看到辅助实现HashSet的map中的value其实都是Object类的同一个对象。
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet 不保证元素的顺序,而且HashSet允许使用 null 元素。
HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
public static <T> Set<T> synchronizedSet(Set<T> s) {
return new SynchronizedSet<>(s);
}
SynchronizedSet如下
static class SynchronizedSet<E>
extends SynchronizedCollection<E>
implements Set<E> {
private static final long serialVersionUID = 487447009682186044L;
SynchronizedSet(Set<E> s) {
super(s);
}
SynchronizedSet(Set<E> s, Object mutex) {
super(s, mutex);
}
public boolean equals(Object o) {
if (this == o)
return true;
synchronized (mutex) {return c.equals(o);}
}
public int hashCode() {
synchronized (mutex) {return c.hashCode();}
}
}
HashSet的两种遍历方式
public class HashSetIteratorTest {
public static void main(String[] args) {
- HashSet set = new HashSet();
- for (int i=0; i<5; i++)
set.add(""+i);
- iteratorHashSet(set) ;
- foreachHashSet(set);
}
/*
* 通过Iterator遍历HashSet。推荐方式
*/
private static void iteratorHashSet(HashSet set) {
for(Iterator iterator = set.iterator();
iterator.hasNext(); ) {
System.out.printf("iterator : %s\n", iterator.next());
}
}
/*
* 通过for-each遍历HashSet。不推荐!此方法需要先将Set转换为数组
*/
private static void foreachHashSet(HashSet set) {
String[] arr = (String[])set.toArray(new String[0]);
for (String str:arr)
System.out.printf("for each : %s\n", str);
}
}
阅读全文
1 0
- HashSet源码探讨(基于JDK1.8)
- ArrayList源码探讨(基于JDK1.8)
- Vector源码探讨(基于JDK1.8)
- LinkedList源码探讨(基于JDK1.8)
- Stack源码探讨(基于JDK1.8)
- Hashtable源码探讨(基于JDK1.8)
- WeakHashMap源码探讨(基于JDK1.8)
- HashSet源码分析(基于JDK1.6)
- JDK1.8源码学习之HashSet.java
- HashSet及LinkedHashSet源码分析(基于JDK1.6)
- LinkedList源码分析(基于jdk1.8)
- JDK1.8 HashSet
- HashSet源码分析(基于1.8)
- HashSet源码分析(基于JDK8)
- Java Collections Framework之HashSet及LinkedHashSet源码分析(基于JDK1.6)
- 基于jdk1.8的ThreadPoolExecutor源码分析
- ConcurrentHashMap源码分析(基于JDK1.8)
- ConcurrentHashMap源码分析(基于JDK1.8)
- 集合2
- rn环境搭建和命令相关
- 1009. 说反话 (20)
- android studio 中怎么在模拟机上下载音乐(如何把音乐放到android studio的模拟器中)
- css学习心得
- HashSet源码探讨(基于JDK1.8)
- 11.潜伏者
- 【1015】周几
- Python数据库之--PyMySQL
- 两层iframe嵌套导致不能全屏问题
- 微博存在的伦理道德问题
- 基于合作覆盖认知无线电网络能量接收的联合资源分配和准入控制
- Shader山下(二十五)顶点照明中的灯光信息
- 汇编实现命令行