首先是继承了字典类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. 个人项目cpu占用图

  2. syslog日志打印

    最近syslog出了一次问题,我们配置了不同appname打印到不同文件.现在用不同appname打印log的时候,偶然会混在一起.检查过配置后,觉得不是配置问题,如果是配置问题应该每一条都会打错位置 ...

  3. JDK1.8环境下依然报错 Unsupported major.minor version 52.0

    JDK1.8环境下依然报错 Unsupported major.minor version 52.0 在配置elasticsearch-rtf全文搜索引擎时,按照Github上项目readme.md来 ...

  4. mysql 导入数据库问题

    今天数据库迁移测试,发现存储过程导入不了,提示如下错误: Cannot load from mysql.proc. The table is probably corrupted 原因是mysql5. ...

  5. #20175120彭宇辰-实验一《Java开发环境的熟悉》实验报告

    Java开发环境的熟悉-1 实验要求:1 .建立“自己学号exp1”的目录2 .在“自己学号exp1”目录下建立src,bin等目录3 .javac,java的执行在“自己学号exp1”目录4 .提交 ...

  6. canvas 填充图片

    画一个更骚气的圆 https://juejin.im/post/5781d0495bbb500061fd683d

  7. java中字符串"1999-10-01T00:00:00+08: 00" 转化为Date格式

    String oldStr = "1999-10-01T00:00:00+08: 00": SimpleDateFORMAT sdf = new SimpleDateFORMAT ...

  8. echart 百度地图实现效果

    1 必须引入 echarts.js文件 以及 china.js 点文件才可以执行代码2 ehcart官方文档有点小恶心,看了半天,好多东西都不是很清楚,必须挨个实验才行,希望对一些初学者来说可以少走一 ...

  9. eclipse中js报错简单快捷的解决方式

    eclipse中对正确的js文件报错十分常见,我的项目中只要是以.js结尾的必会报错,作为一名小小的程序员,看到“满江红”甚是烦躁!今天就给大家分享一个方便又快捷的解决方案. 瞄准被报错的js文件点鼠 ...

  10. tornado--启动

    tornado--启动 from tornado import web from tornado import ioloop from tornado.httpserver import HTTPSe ...