`
yuyiming1986
  • 浏览: 63668 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

HashSet源码分析

阅读更多

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();
    }
 

 

 

 

分享到:
评论

相关推荐

    hashset源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    【死磕Java集合】-集合源码分析.pdf

    六、HashSet源码分析 HashSet是一种基于散列表实现的Set,提供了快速的元素存储和检索能力。HashSet的继承体系中,它继承了AbstractSet,实现了Set接口。 HashSet的主要属性包括元素数组elementData、元素个数size...

    Android中高级面试必知必会.pdf

    ArrayList .....25 3.LinkedList.........30 4.Hashset 源码分析........35 5. 内存模型.......47 6. 垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射......

    Java基础学习25.pdf

    ### HashSet源码分析 1. **构造器**:HashSet提供了多个构造器,可以创建默认容量的HashSet,指定容量和负载因子的HashSet,或者带有一个初始集合的HashSet。 2. **add(E e)**:向HashSet添加元素时,实际上是将...

    Android+上百实例源码分析以及开源分析+集合打包3

    在Android开发领域,深入理解和应用源码分析以及开源库的运用是提升技能的关键步骤。"Android+上百实例源码分析以及开源分析+集合打包3"这个资源提供了丰富的学习材料,涵盖了多个方面,旨在帮助开发者更好地理解和...

    Java源码分析Iterable.pdf

    Java源码分析Iterable Java源码分析Iterable是Java编程语言中一个基础组件的源码分析,Iterable是一个接口,它允许对象被迭代,例如foreach循环中的数组或集合。了解Iterable的源码,可以帮助开发者更好地理解Java...

    Java面试题 从源码角度分析HashSet实现原理

    通过源码分析, HashSet的实现原理可以分为以下几个方面: 1. HashSet的构造函数:HashSet的构造函数中,会创建一个HashMap对象,用于存储集合元素。`public HashSet() { map = new HashMap();}` 2. HashSet的add...

    集合框架源码分析

    5. **源码分析:HashSet** `HashSet`是基于`HashMap`实现的,它不存储键值对,而是将每个元素作为键,其值总是`null`。这使得`HashSet`可以快速地检查元素是否存在,因为这等同于检查键是否在`HashMap`中。 6. **...

    集合的概念及应用和HashSet保证数据不重复的原理

    同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...

    java集合类源码分析之Set详解.docx

    以下是对HashSet关键方法的源码分析: 1. 构造器: - `HashSet()`:创建一个空的HashSet,其内部的HashMap默认容量为16。 - `HashSet(Collection&lt;? extends E&gt; c)`:根据传入的集合c初始化HashSet,HashMap的容量...

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    在HashSet的源码分析中,可以看到HashSet是通过map(HashMap对象)保存内容的。HashSet中的map变量是transient的,也就是说,HashSet对象在序列化时,不会将map对象序列化。HashSet中还定义了一个静态final变量PRESENT...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    Java集合框架是Java编程中非常重要的部分,它提供了一种高效、灵活的数据组织方式。本文主要探讨了几个关键...通过对源码的深入分析,我们可以更好地掌握Java集合框架的工作原理,并根据实际需求选择最适合的数据结构。

    Lucene 2.4.1源码分析

    《Lucene 2.4.1 源码分析——Analyzer深入解析》 在Lucene这个强大的全文搜索引擎库中,Analyzer扮演着至关重要的角色。它负责将输入的文本进行分词,过滤,标准化等预处理操作,使得搜索引擎能够正确理解和索引...

    c# HashSet的扩容机制需要注意的

    HashSet 的扩容机制主要通过两个方面来实现:一是查看 HashSet 底层源码,二是了解 HashSet 的扩容机制。 1. 查看 HashSet 底层源码 要了解 HashSet 的扩容机制,我们需要查看 HashSet 的源码。HashSet 的源码中有...

    java集合类源码分析之Set详解

    Java集合类源码分析之Set详解 Java集合类中的Set Interface是用于存储无序、不可重复元素的集合接口。Set Interface继承自Collection Interface,提供了基本的集合操作,如add、remove、contains等。Set Interface...

    Android_上百实例源码分析以及开源分析_集合打包1

    这个压缩包"Android_上百实例源码分析以及开源分析_集合打包1"显然包含了丰富的Android应用开发实例和源码解析,旨在帮助开发者深入理解Android系统的工作原理,提高代码调试和优化能力。下面将详细探讨其中可能涵盖...

    Java rt.jar 源码分析

    源码分析对于深入理解Java平台的工作原理、优化代码性能以及进行二次开发具有重要的价值。 rt.jar中的源码虽然默认并未提供,但可以通过一些工具,如JDK的`src.zip`或者使用OpenJDK的源码仓库来获取。这些源码提供...

    Java源码分析:集合-容器.pdf

    首先,Set集合是一个不允许重复元素的集合,它有多种实现方式,其中包括HashSet、TreeSet和LinkedHashSet。HashSet是基于HashMap实现的,其元素存储在HashMap的key上,而value使用一个静态的默认对象。为了保证元素...

    常见的java集合源码分析,以及面试题

    本文将深入剖析Java集合的源码,探讨其内部实现机制,并结合常见面试题,帮助你更好地理解和应用这些知识。 首先,我们从基础开始,Java集合框架主要分为两大类:List(列表)和Set(集合)。List接口包括ArrayList...

    hadoop源码分析

    Hadoop,作为大数据处理领域的重要框架,其源码分析对于开发者来说具有极高的价值。本文将深入探讨Hadoop的核心组件,包括Configuration、JobClient、JobConf以及JobTracker、TaskTracker等,并详细解析Hadoop作业...

Global site tag (gtag.js) - Google Analytics