HashSet源码分析
HashSet是Set的一个实现,Set定义一个集合,集合的一个特征是不能包含重复的元素(可以包含null),HashSet底层使用HashMap作为存储结构来实现。
可知HashSet只用来存储对象,并不是key-value对,因为HashMap中的key必须是不同的,跟集合的定义相同,
所以HashSet只使用HashMap中的key来存储元素,而value字段使用同一个常量对象PRESENT就可以了。
private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
可知HashSet中判断将要被存储的元素是否已经存在集合中,被转移到HashMap中判断key值是否有重复,而key的判断逻辑如下:
//x,y是两个key
static boolean eq(Object x, Object y) {
return x == y || x.equals(y);
}
那么到底要不要重写HashSet中对象的equals()方法呢?个人认为这个还是需要根据具体应用需求来决定,默认情况下equals()实现就是比较(x == y),重写以后就是比较两对象的属性值是否相等。
如果应用场景认为,两个对象相同的条件是指向同一个引用,就不需要重写equals()方法了。
如果应用场景认为,两个对象相同的条件是指内部属性值相同,就需要重写equals()方法了。
构造函数
//可知HashSet只用来存储对象,并不是key-value对,因为HashMap中的key必须是不同的,跟集合的定义
//相同,所以HashSet只使用HashMap中的key来存储元素,而value字段使用一个final Object PRESENT就可以
public HashSet() {
map = new HashMap<E,Object>();
}
//构造函数中指定底层HashMap的initialCapacity和loadFactor
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
add()方法
public boolean add(E o) {
//value值为PRESENT对象,一个常量对象
return map.put(o, PRESENT)==null;
}
remove()方法
public boolean remove(Object o) {
//map.remove(o)可能返回null,那就表示不存在目标Object o
//删除失败
return map.remove(o)==PRESENT;
}
contains()方法
public boolean contains(Object o) {
//到HashMap的Key中去查找目标对象O
return map.containsKey(o);
}
Iterator
//HashSet自己没有实现Iterator接口,而使用HashMap的实现
public Iterator<E> iterator() {
return map.keySet().iterator();
}
分享到:
相关推荐
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
六、HashSet源码分析 HashSet是一种基于散列表实现的Set,提供了快速的元素存储和检索能力。HashSet的继承体系中,它继承了AbstractSet,实现了Set接口。 HashSet的主要属性包括元素数组elementData、元素个数size...
ArrayList .....25 3.LinkedList.........30 4.Hashset 源码分析........35 5. 内存模型.......47 6. 垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射......
### HashSet源码分析 1. **构造器**:HashSet提供了多个构造器,可以创建默认容量的HashSet,指定容量和负载因子的HashSet,或者带有一个初始集合的HashSet。 2. **add(E e)**:向HashSet添加元素时,实际上是将...
在Android开发领域,深入理解和应用源码分析以及开源库的运用是提升技能的关键步骤。"Android+上百实例源码分析以及开源分析+集合打包3"这个资源提供了丰富的学习材料,涵盖了多个方面,旨在帮助开发者更好地理解和...
Java源码分析Iterable Java源码分析Iterable是Java编程语言中一个基础组件的源码分析,Iterable是一个接口,它允许对象被迭代,例如foreach循环中的数组或集合。了解Iterable的源码,可以帮助开发者更好地理解Java...
通过源码分析, HashSet的实现原理可以分为以下几个方面: 1. HashSet的构造函数:HashSet的构造函数中,会创建一个HashMap对象,用于存储集合元素。`public HashSet() { map = new HashMap();}` 2. HashSet的add...
5. **源码分析:HashSet** `HashSet`是基于`HashMap`实现的,它不存储键值对,而是将每个元素作为键,其值总是`null`。这使得`HashSet`可以快速地检查元素是否存在,因为这等同于检查键是否在`HashMap`中。 6. **...
同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...
以下是对HashSet关键方法的源码分析: 1. 构造器: - `HashSet()`:创建一个空的HashSet,其内部的HashMap默认容量为16。 - `HashSet(Collection<? extends E> c)`:根据传入的集合c初始化HashSet,HashMap的容量...
在HashSet的源码分析中,可以看到HashSet是通过map(HashMap对象)保存内容的。HashSet中的map变量是transient的,也就是说,HashSet对象在序列化时,不会将map对象序列化。HashSet中还定义了一个静态final变量PRESENT...
Java集合框架是Java编程中非常重要的部分,它提供了一种高效、灵活的数据组织方式。本文主要探讨了几个关键...通过对源码的深入分析,我们可以更好地掌握Java集合框架的工作原理,并根据实际需求选择最适合的数据结构。
HashSet 的扩容机制主要通过两个方面来实现:一是查看 HashSet 底层源码,二是了解 HashSet 的扩容机制。 1. 查看 HashSet 底层源码 要了解 HashSet 的扩容机制,我们需要查看 HashSet 的源码。HashSet 的源码中有...
Java集合类源码分析之Set详解 Java集合类中的Set Interface是用于存储无序、不可重复元素的集合接口。Set Interface继承自Collection Interface,提供了基本的集合操作,如add、remove、contains等。Set Interface...
这个压缩包"Android_上百实例源码分析以及开源分析_集合打包1"显然包含了丰富的Android应用开发实例和源码解析,旨在帮助开发者深入理解Android系统的工作原理,提高代码调试和优化能力。下面将详细探讨其中可能涵盖...
源码分析对于深入理解Java平台的工作原理、优化代码性能以及进行二次开发具有重要的价值。 rt.jar中的源码虽然默认并未提供,但可以通过一些工具,如JDK的`src.zip`或者使用OpenJDK的源码仓库来获取。这些源码提供...
首先,Set集合是一个不允许重复元素的集合,它有多种实现方式,其中包括HashSet、TreeSet和LinkedHashSet。HashSet是基于HashMap实现的,其元素存储在HashMap的key上,而value使用一个静态的默认对象。为了保证元素...
本文将深入剖析Java集合的源码,探讨其内部实现机制,并结合常见面试题,帮助你更好地理解和应用这些知识。 首先,我们从基础开始,Java集合框架主要分为两大类:List(列表)和Set(集合)。List接口包括ArrayList...
Hadoop,作为大数据处理领域的重要框架,其源码分析对于开发者来说具有极高的价值。本文将深入探讨Hadoop的核心组件,包括Configuration、JobClient、JobConf以及JobTracker、TaskTracker等,并详细解析Hadoop作业...