首先是继承了字典类Dictionary,
这说明HashTable的一些找位置的实现与Dictionary有关,

看一看数据结构,是一个entry数组,
Entry,这个不陌生,先看一下它的结构吧,这样更加能理解,
每个节点包括hash值,key,value,还有下一个节点,这像不像c++中的链表呢?
是的,Entry的每一个元素都是一个链表,
看一张图,表示hashtable中的存储结构,弄清楚这个都比较好理解了,一开始我就是这里没看清楚,还导致对一些方法产生了误解,(ps:其实这么多中间最不能让我理解的就是contains的双重循环,这是我当初的问题,好蠢)


另一个重点是hash的计算,
-----------分割线-----------
说到底这里的hashcode是object的,具体还得看继承它的类是怎么实现的,

回到主线,
容量啊,加载因子啊,就不说了,看个这个,hashseed,
目的是让hash值的重复几率变小,

这个hashSeed的初始化要借用到一个值,capacity(最大容量),
这,就触及到我的知识盲区了,不过看这流程是随机出的一个值,不过这个值不是平常意义上的随机,是有一定的条件的,
在做hash时要考虑hash冲突,以前在学c++数据结构时有一些像开放地址法这类的解决办法,估计这里是它的一种解决办法,通过这种hashseed和hashcode结合,

接下来是HashTable的初始化了,有4种方式,不过总体来说,最终都是调用了第一种,
(1)给出容量和负载因子
(2)给一个容量,默认负载因子
(3)默认
(4)用map初始化

HashTable中的hash,
这个是最后的计算,hashSeed ^ k.hashCode()

hashhTable有一个hashCode是这样的,
不过不要误会,这是map的hashcode,可不是key的,

想来想去还是先要看put方法,在这之前,先弄清楚 int index = (hash & 0x7FFFFFFF) % tab.length;
网上看到一个回答,感觉不错,
总共是32位,1位符号位,

put方法,
计算hash值,计算index,从index链表找,如果找到了(不仅要hash值相同,key也要一样),则改旧的值,然后返回了,
如果没找到,则看要不要要扩容了,
如果count要大于(int)(capacity * loadFactor).)了,扩容:rehash,算新的index;否则不扩容,
最后都要放入新的Entry,在index链表(这个index已经不是最初的那个了)插入,目测是开头插入了,

扩容的rehash,
算出了新的capacity,然后建了一个新的Entry数组,boolean rehash是看要不要随机出新的hashseed,接下来是复制old到new的Entry了,复制过程中(双重循环哦),如果rehash的true的话,那么每个元素的key的hash要重新计算了,index也要重算喽,然后在index插入,

有入就有出,remove,
删除这里要考虑一个问题,要判断是第几次找到,如果第一下就找到是要删除的,直接把index链表值替换掉,如果不是第一次就找到哦,那么就要通过pre来指向e.next,从而过滤掉e,

哦,对了,注意哦,hashTable是线程安全的,很多方法都使用了synchronized同步,
从尾部向头部找,这个是找值的方法,注意双重循环,大数组,小链表!

这个是找key的方法,
首先根据传进来的key算出hash值,然后根据这个hash值算出index,从这个index链表开始向后面找,

得到value,


hashTable主要的内容已经在这了,需要先把这些基础的搞懂,再去考虑一些效率啊,逻辑啊~


@Arya0624

HashTable源码简单介绍的更多相关文章

  1. 史上最简单的的HashTable源码分析

    HashTable源码分析 1.前言 Hashtable 一个元老级的集合类,早在 JDK 1.0 就诞生了 1.1.摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap.Link ...

  2. 并发-HashMap和HashTable源码分析

    HashMap和HashTable源码分析 参考: https://blog.csdn.net/luanlouis/article/details/41576373 http://www.cnblog ...

  3. android 源码目录介绍

    Android 4.0源码目录介绍|-- Makefile|-- bionic (bionic C库)|-- bootable  (启动引导相关代码)|-- build (存放系统编译规则及gener ...

  4. JAVA的HashTable源码分析

    Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长.Hashtable ...

  5. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  6. FFmpeg的HEVC解码器源码简单分析:解码器主干部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  7. Java入门系列之集合Hashtable源码分析(十一)

    前言 上一节我们实现了散列算法并对冲突解决我们使用了开放地址法和链地址法两种方式,本节我们来详细分析源码,看看源码中对于冲突是使用的哪一种方式以及对比我们所实现的,有哪些可以进行改造的地方. Hash ...

  8. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  9. 转:【Java集合源码剖析】Hashtable源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元 ...

随机推荐

  1. Could not find a version that satisfies the requirement PIL

    Python Imageing Library 简称 PIL Python常用的图像处理库之一 Pillow是PIL一个fork. C:\Users\dangzhengtao>pip insta ...

  2. Dart 创建List

    list的常用的操作 1. [] ,length  获取元素,和数组长度 2. add(), insert ()添加元素 3. remove(),clear() 删除元素 4.indexOf (), ...

  3. position(3rd week blog)

    static:静态的默认属性,上(top)下(bottom)左(left)右(right)等参数不会执行没有影响.relative:此属性会根据上(top)下(bottom)左(left)右(righ ...

  4. 关于jstl中碰到的Property 'username' not found on type java.lang.String异常

    在jstl的forEach循环的时候总是有异常,刚开始以为是把类的属性名打错了,因为显示的是Property not found,但就算从类文件里面复制属性名过来依然显示的是Property not ...

  5. 在VMware上安装CentOS6 64位操作系统

    ---恢复内容开始--- 1.创建新的虚拟机 2.选择自定义,点击下一步: 3.找到镜像位置,添加: 4.点击“稍后安装操作系统”,点击“下一步”: 5.默认点击“下一步”,然后分配CPU: 这里内存 ...

  6. vue使用axios 时 后台接收不到数据

    后台用django 时,默认接收的数据格式为formdata ,前端如果传了其他格式会出现后台收不到参数的情况. 前端参数转 fromdata 代码如下 let formData = new Form ...

  7. Spark菜鸟记录

    1.RDD[(k,v)] join()优化,join之前会对两个RDD的key做hash,通过网络把相同hash值的数据传到同一个节点,因此对多次join的RDD 做预分区与持久化可提高效率. map ...

  8. sql server 与 sql server compact 互相数据导入

    从SQL Server 导出数据到 Sql Compact 使用 Sql Server Compact Tool box 从SQL Server Comapct 导出数据到  Sql Server 使 ...

  9. rsync命令简单用法介绍

    rsync有两种常用的认证方式,一种为rsync-daemon方式,另外一种则是ssh.在一些场合,使用rsync-daemon方式会比较缺乏灵活性,ssh方式则成为首选.但是今天实际操作的时候发现当 ...

  10. 17.2 SourceInsight批量注释

    将下面的代码保存为codecomm.em并添加到工程,在Options->Menu Assignments中就可以看到这个宏macro CodeComments,给这个宏添加热键. 执行一次Ct ...