`

JAVA集合类(5):HashMap与HashSet源码深度剖析

 
阅读更多

查看 HashSet的源码会发现,HashSet是由HashMap生成。

public HashSet() {
	map = new HashMap<E,Object>();
    }

 当使用HashSet的add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)。如下为源码。

private static final Object PRESENT = new Object();
public boolean add(E o) {
	return map.put(o, PRESENT)==null;
 }

 HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组中;

在向HashMap中put一对键值时,它会根据key的hashcode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。如果该位置没有对象存在,就将此对象直接放进数组中,如果该位置已经有对象存在了。则顺着此存在的对象链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一对象),如果此链上有对象,再去用equals方法进行比较,如果此链上的某个对象的equals方法比较为false,则将该对象放到数组中,然后将数组中该位置以前存在的那个对象链接到此对象后面,使用Entry对象的next变量来链。之所以要将新值放到数组中,则旧值放在链接中,是因为新值更有可能被访问。

 

分享到:
评论

相关推荐

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

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

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

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

    集合类底层源码解析汇总

    java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。

    java9源码下载-Java:java练习

    java9 源码下载 Java se 基础练习 每个目录为一个大的模块(如 集合,数据结构,反射,设计模式等),目录的详信息将在二级目录下详细列出 ...Collections集合类的使用(synchronized 包装等) queue stack commonlyCla

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

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

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

    11.4.1 实现类HashMap284 11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 实现类Properties287 11.5 Collections类288 11.6 泛型概述292 11.7 本章习题300 第12章 12.1 理解线程304 12.1.1 什么是多...

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

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

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

    类字节码文件深度剖析 垃圾收集机制详解 十种垃圾收集器详解 JVM调优工具详解 GC日志详细分析 JVM调优实战 Mysql性能调优 SQL执行原理详解 索引底层剖析 执行计划与SQL优化 Mysql锁机制与事务隔离级别详解 并发编程 ...

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

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

    疯狂JAVA讲义

    学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...

    安卓java读取网页源码-questions:自问自答

    安卓java读取网页源码 questions 自问自答 待初答 注:认真对待每一个答案。 Java String、StringBuilder 和 StringBuffer 有什么区别 == 和 equals 和 hashCode 有什么区别 说说你对 final 修饰符的理解 说说你对...

    安卓java读取网页源码-interview:安卓面试

    安卓java读取网页源码 Android-Interview Java 基础 父类的静态方法能否被子类重写? 静态属性和静态方法是否可以被继承?是否可以被重写?为什么? 什么是内部类?内部类、静态内部类、局部内部类和匿名内部类的...

    Java JDK实例宝典

    19 线程——BlockingQueue 第17章 Java与XML 17. 1 用DOM处理XML文档 17. 2 用SAX处理XML文档 17. 3 用XSLT转换XML 17. 4 对象与XML的转换 第18章 Java Mail 18. 1 使用SMTP协议发送...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    框架中的MongoDB项目是我用来作为文件服务器的一个实现,很简单实现了上传下载删除和预览的几个接口,大家可以看源码,有朋友问到秒传怎么做 这里只是简单说一个关键词(MD5)原理自行理解吧 Redis延迟消费的项目是...

Global site tag (gtag.js) - Google Analytics