`
yuyiming1986
  • 浏览: 62110 次
  • 性别: 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面试题 从源码角度分析HashSet实现原理

    主要介绍了Java面试题 从源码角度分析HashSet实现原理?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    这篇集合总结一共包括十二节,介绍了一些接口和实现类的底层源码以及基本的增加、删除元素等的操作(包括List、Map、Set接口、ArrayList、Vector、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类)。...

    java8集合源码分析-LearningNotes:Java笔记

    源码分析:ArrayList、Vector、LinkedList、HashMap、ConcurrentHashMap、HashSet、LinkedHashSet and LinkedHashMap 线程状态、线程机制、线程通信、J.U.C 组件、JMM、线程安全、锁优化 磁盘操作、字节操作、字符...

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    集合源码分析 java基础复习 [TOC] 一、集合 1.Iterator 2.Collection 2.1 List---&gt;有序、有索引、元素可重复 1.ArrayList: 底层是数组结构、查询快、增删慢、不同步 添加第一个元素的时候,创建默认个数是10个,...

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    javabitset源码-JerrySoundCode:杰瑞声码

    bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...

    【JDK1.8源码剖析】Collection接口

    文章目录Collection源码剖析(一)简介(二)源码分析 Collection源码剖析 (一)简介 Collection接口是集合层次结构中的根接口。 (1)下面是常用集合类关系图 Collection  |___List 有序,可重复  |___...

    Collections源码java-Java_collections:Java的ArrayList、LinkedList、HashMap、Tr

    Collections 源码 java Java Java的ArrayList、LinkedList、HashMap、TreeMap、LinkedHashMap、HashSet、TreeSet相关源码分析,及相关问题和应用总结。

    飞秋java源码-interviewNote:面试笔记

    源码分析:ArrayList、Vector、LinkedList、HashMap、ConcurrentHashMap、HashSet、LinkedHashSet and LinkedHashMap Java 并发编程  &gt; ​ 线程机制、线程通信、J.U.C组件、JMM、线程安全、锁优化 Java I/O  磁盘...

    基于javatcpsocket通信的拆包和装包源码-java-interview:java基础知识点

    基于java tcp socket通信的拆包和装包源码 java-interview javac.exe&java.exe&javadoc.exe&PATH&CLASSPATH ...源码分析(集合&框架) 运行时数据区域 内存溢出 垃圾回收 垃圾收集器 类加载的过程 ComboBox(下拉列表框)

    javajdk1.8源码-Java-source-reading:jdk1.8源代码分析

    java jdk1.8 源码 Java-source-reading 缓慢更新一些个人学习java相关源码过程中的笔记,在这里你将不可避免地看到以下情况: 个别不懂/没想好的地方留空待补全 限于个人水平出现的解读错误 ...HashSet LinkedHashMap

    java8集合源码-IteRace:Java并行循环的竞争检测

    java8集合源码赛马 IteRace 是伊利诺伊大学开发的静态竞态检测工具。 静态竞争检测器存在不精确性(由于保守的假设),这通常表现为程序员需要检查的数量难以管理的警告。 ItRace 通过专业化来解决这个问题: 它了解...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...

    Java集合总结.txt

    单个集合的学习路线:使用-&gt;做实验-&gt;画图-&gt;分析源码 集合:大小可变的序列,只能存放对象 集合和数组的区别: 1.集合是大小可变的序列,数组在声明后,长度不可变 2.数组只能存放声明时指定的一种数据类型,集合...

    百度地图开发java源码-blog-backup:学习文章,也是我博客的备份

    删除链表中重复的节点[无序的情况下-HashSet] 二. Notes for Android Heros 三. Notes for Arts of Android Dev 本章介绍 View 的基本概念和 View 的滑动相关知识以及关于 View 的事件分发机制实例和源码解析。 本篇...

    java内核源码-JavaCompass:「Java指南针」为你学习Java指明方向。内容涵盖互联网Java工程师所需要掌握的核心知识,涉及J

    HashSet&TreeSet 索引技术 中文分词算法 Lucene 性能调优 JVM性能调优 JVM类加载机制详解 JVM内存模型 类字节码文件深度剖析 垃圾收集机制详解 十种垃圾收集器详解 JVM调优工具详解 GC日志详细分析 JVM调优实战 ...

    java基础案例与开发详解案例源码全

    11.2.1 实现类HashSet267 11.2.2 实现类LinkHashSet270 11.2.3 实现类TreeSet272 11.3 List接口实现类277 11.3.1 实现类ArrayList277 11.3.2 实现类LinkedList279 11.3.3 实现类Vector281 11.4 Map接口283 11.4.1 ...

    java范例开发大全(pdf&源码)

    实例204 利用HashSet删除学生 358 实例205 不重复的随机数序列 360 实例206 运用映射的相关类(Map) 363 实例207 运用集的相关类(Set) 365 12.2 List 368 实例208 增加所需的元素 368 实例209 Iterator迭代器的...

    疯狂JAVA讲义

    学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...

Global site tag (gtag.js) - Google Analytics