首先是继承了字典类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. 03MYSQL数据库

    mySQL 数据库 储存数据,属于中小型数据库   默认端口号 3306  密码root sql是一门编程语言 结构化查询语言  是强类型语言(定义变量时要指定变量类型) 字符串有两种类型:  定长: ...

  2. 网络编程三 Socket

    1.根据netstat端口的找到进程号---->根据进程号找到进程名称-------->终止进程 1) netstat    最后一列是5432 C:\Users\Administrato ...

  3. QT 读写配置文件 .ini

    高端大气上档次!码住 读取配置文件: //根据目录寻找配置文件 QSettings* setting = new QSettings("configs/config.ini", Q ...

  4. SDL中 so库的使用

    用到的项目:Tocy-Android-SDLv2 JAVA层:只有一个 SDLActivity.java 路径\Android-SDLv2\src\org\libsdl\app 项目简单分析: 默认在 ...

  5. 20164301 Exp2 后门原理与实践

    Exp2 后门原理与实践 1.实验内容  (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterprete ...

  6. 非常完善的两个微服务框架比较(SpringCloud与Dubbo)

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...

  7. 序列化、time、random、hashlib、sys模块

    •很多常用和内置模块,我们只需要掌握他们的用法而暂时不用考虑内部是如何实现的,这些模块大大提升了开发效率 ! 1.json模块与pickle模块 •json 如果你有这样的困扰,当希望把一种数据存到硬 ...

  8. win10刻录光盘失败,一直显示有准备好写入到光盘中的文件

    这是因为前面刻录留下的缓存导致的 解决方法是,删除系统刻录缓存文件 刻录缓存路径大概在以下位置(其中ase那个地方需要修改,改成自己的登录用户账号名即可) C:\Users\ase\AppData\L ...

  9. cout设置输出数据不显示科学计数法

    [解决方案] 1.在头文件包含—#include<iomanip>——定义IO流输出输入格式控制相关函数. 2.利用cout输出格式为—cout << fixed <&l ...

  10. innobackupex一些常用备份选项

    指定数据库备份[root@node1]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=password ...