首先是继承了字典类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. 学习Markdown

    目录 杂 标题 代码展示 额外空行 强调 [转载请注明出处]http://www.cnblogs.com/mashiqi 2018/01/02 杂 Markdown是承接着html语言的,它兼容htm ...

  2. Centos7.5系统 SSH升级到7.9

    SSH7.9安装 #!/bin/bash#删除旧版ssh包 危险操作,不删除也可以安装,建议跳过此操作.#rpm -e `rpm -qa | grep openssh` #安装zlib依赖包wget ...

  3. mysql 创建用户、设置权限

    MySQL创建用户与授权 一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用 ...

  4. EOS wallet API 报HTTP 400错误

    服务器:192.168.8.144 按照官方的docker方式运行的,因为keosd(钱包)开出来的API只容许本地访问,即: url --request POST --header 'Host: 0 ...

  5. c++中函数的内存注意项

    函数不能返回指向栈内存的指针!因为返回的都是值拷贝! char *str = "abcd"这样就是字符串常量,这种能返回,而char str[] = "abcd" ...

  6. day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参

    函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...

  7. OnTriggerEnter2D方法

    我两个物体A,B都添加了Circle Collider 2D,并且都勾选了is Trigger,我在A的脚本里用void OnTriggerEnter2D(Collider2D coll)检测碰撞,至 ...

  8. Vue通过路由 query传递参数

    父组件通过query来传递num参数为1,相当与在 url 地址后面拼接参数 <template> <div> <h3>首页</h3> <rout ...

  9. javaEE十三种核心技术

    郭晨 软件151 1531610114 java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JAVAEE的核心API与组件 JAVAEE平台由一整套服务( ...

  10. 【爬虫综合作业】猫眼电影TOP100分析

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075 一.爬虫对象 猫眼电影TOP100排行榜 二.代码如下 im ...