HashMap以及跟HashMap相关的内容

HashMap相信大家都用过,是以<key,value>这样的格式存储的。其实内部真正用于存储的是entry的数组table(桶)。,下面就是源代码了已经标注出来了


emprty_table是个空表,用于是初始化时使用的。default_load_factor是负载因子,default_initial_capacity是初始化容量,maximum_capacity是最大容量是2^30=1073741824.

size才是你存储的容量大小。   



Integer.hightestOneBit(int)是将给定参数的最高位的1保留,剩下的变为0的操作,简单说就是将参数int变为小于等于它的最大的2的n次幂。

讲一下entry的结构,有个key,value和对应下一个entry对象next和hash值,类似链表结构。


接下来讲解一下hashmap的最为重要的取值get(key),存储put(key,value)的内容,在这之前,hashmap并不是直接将key作为桶table的下标,而是经过计算hash(key)=hashcode,在拿hashcode进行函数indexFor()计算出对应index。接下来先讲一下get的过程。

1.get在取值的过程中,先进性判断key是否为null,如果为null,直接定位到index=0的链表列,然后做循环查找key为null的value,如果key不为空,进行hash(key),indexFor()运算得到下标i,计算出对应的index=i的链表列,然后循环查找此链表列key等同的value,找不到返回null。贴一下源代码


2.put的存储值的过程是,(空table扩容我就不说了),判断key是否为null,如果为null,直接定位到index=0的链表列,直接然后做循环查找key为null的对象entry,如果entry对象存在就进行更新value,如果不存在,就创建entry对象,然后将table[0]的链表作为entry的next;如果key不为空,进行hash(key),indexFor()运算得到下标i,计算出对应的index=i的链表列,然后循环查找此链表列key等同的value,如果entry对象存在就进行更新value,如果不存在,就创建entry对象,然后将table[i]的链表作为entry的next。下面是对应的源码。


 添加entry的方法源码:


大概的主要方法讲完了。

但是还有个关键点就是hashmap不是线程安全的,在多线程的环境下,可能出现key对应的value的不一致的。

那在多线程下使用HashMap我们需要怎么做,几种方案:

  • 在外部包装HashMap,实现同步机制
  • 使用Map m = Collections.synchronizedMap(new HashMap(...));,这里就是对HashMap做了一次包装
  • 使用java.util.HashTable,效率最低
  • 使用java.util.concurrent.ConcurrentHashMap,相对安全,效率较高  

第一中就不讲了,可以增加对应sunchronized进行同步代码块操作,稍微讲一下其他三个方法吧。

1. Map map= Collections.synchronizedMap(new HashMap());

这里做的操作就是调用了collections里面synchronizedMap()的方法(里面还有好多其他的list,set等方法),返回了一个一个新的对象SynchronizedMap,此类为collections的内部类,此内容类会对对应的map对象的关键的方法进行同步封装,使其是同步的。


2.hashable也是采用了进行方法包装加上synchronized ,hashtable与hashmap继承不同的类,hashtable继承dictionary类,而hashmap继承abstractmap类,hashtable不允许空值key or  value ,而hashmap是允许一个key为null,多个null 的value。


3.concurrentmap是用了更为新颖的思想,没用用entry对象而是使用了segment对象,而segment继承了可重入锁。

ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类Hash Table的key ,value结构,Segment内部维护了一个链表数组.

HashMap是非线程安全的,Hashtable是线程安全的,但是由于Hashtable是采用synchronized进行同步,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。concurrentmap的内容到时候具体再详解了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值