1.4.4.1.1.3扩容
Hashmap扩容: 扩大到原来的2倍
1.4.4.1.1.4存储对象
如果我们需要在hashmap中存储对象, 并且我们希望它根据对象中的参数来判断是否重复,
那么就要重写这些对象的 hashCode和equals方法
1.4.4.1.1.5长度超过限定转化为红黑树
1.4.4.1.2Hashtable
1)
底层hash表
2)
Hashtable 中的方法是Synchronize的, 同步方法
不允许null键和值
初始长度11 (hashmap初始长度16)
hashtable扩容是2倍+ 1 (hashmap扩容 2倍)
1.5符号表
我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。
key-value
符号表有时也被称为字典。键就是单词,值就是单词对应的定义,发音和词源。
符号表有时又叫做索引。键就是术语,值就是书中该术语出现的所有页码。
索引:
1.5.1符号表分类
无序符号表: hashmap( 数组 + 链表: 散列 )
有序符号表: treemap ( 树: 红黑树: 大小, 比较)
1.5.2无序符号表: 哈希表
我们能够通过hash表存储更多的内容(数据结构的角度)
比如用hash表存储视频
从一个实体提取出一个小整数的过程, 可以称为hash散列
如果存在这么一个转化函数— hash函数
理想情况下不同的键都能转换成不同的索引值
Hash( 实体) {
Return 标记
}
一个优秀的 hash 算法(hash函数),满足以下特点:
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值
通俗的讲: 就是给定一个实体, 能通过hash函数快速的获得一个标记
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
解释: 我们可能, 两个实体通过hash函数计算 — 得到同一个标记
所谓逆向困难, 就是我不能单说某个实体 就是这个标记的明文
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
越充分散列越好
我们可以简单地把哈希函数理解为在模拟随机映射,然后从随机映射的角度去理解哈希函数。
1.5.2.1主流的hash函数
MD4: 128位二进制数,MD4已被证明不够安全。
MD5:128位二进制数 MD5 已被证明不具备"强抗碰撞性"。 王小云
202cb962ac59075b964b07152d234b70
Hashmap: key-value: 明文—md5文
碰撞
加盐:
123aaa
202cb962ac59075b964b07152d234b70
Bbbaaa
SHA1:160位二进制数 , SHA-1 已被证明不具"强抗碰撞性"。
Google: 2017 两份pdf文件 – SHA1算法运算 - 得到相同的160位值
SHA2: 一系列 3个
SHA3: 相关算法已经被提出。
1.5.2.2Hash冲突
。理想情况下不同的键都能转换成不同的索引值。当然这只是理想情况下,所以我们需要处理两个或者多个键都散列到相同索引值的情况 (哈希碰撞)。
处理碰撞冲突。
a. 开放地址法
线性探测法, 平方探测法, 再散列法…
b. 拉链法
线性探测法:
平方探测法:
再散列法:
1)可能维护多个散列函数(hash函数), 通常使用第一个hash函数散列, 如果第一个hash函数散列的位置有元素, 那么通过第二个hash函数散列, ………
2)维护一个hash函数, 散列, 如果散列位置有内容, 那么 用散列值再散列
1.5.3简单的网络交互
1.5.3.1一个浏览器页面是怎么产生的
通过几种途径在浏览器打开一个新的页面:
1)直接输入网址
2)网页内搜索(form表单)
3)点击跳转(超链接)
本质都是浏览器根据上面用户的动作, 发起了一个请求
请求到哪去了? 服务器
https://www.baidu.com/s?wd=1234&rsv_spt=1&rsv_iqid=0xb17d5c1500024456&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=0&rsv_btype=i&inputT=1115&rsv_sug4=2218
URL: 统一资源定位符
1.5.3.2互联网的产生
电脑: 上世纪中叶
互联网: 上世纪90年代
电脑: 计算数据
存储文件: 大学, 实验室
粒子实验室.
1)标记不同的电脑
2)传输方式(010101) ( 数字信号, 模拟信号, 光信号 )
文件–01010 --文件, 是需要有规则的
规则—协议
3)
怎么显示, (论文)怎么描述
规定了统一的文件展示方式(浏览器: 网页)
互联网的三要素(之初): url ip http 应用层协议 html - 解决显示和描述问题
局域网
公网
255.255.255.255
256
2的8次方
192.168.3.61
Ipv4: 划分成几种类别 A B C D E
Ipv6
1.5.3.2.1url
https://www.baidu.com/s?wd=1234&rsv_spt=1&rsv_iqid=0xb17d5c1500024456&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=0&rsv_btype=i&inputT=1115&rsv_sug4=2218
http://115.29.141.32:8085/#/mall/show/index
url分三部分: 协议部分 域名或者ip部分+ 端口号 服务器内部路径+参数
如果有域名- ip地址 (dns解析: 把域名—映射成ip地址 )
怎么根据ip地址找到一台服务器(电脑): 路由
http://localhost:63342/code/com/cskaoyan/day5/Demo1HashMap.java
1.6 红黑树
是一种特殊的二叉搜索树
自平衡的二叉搜索树
1.6.1自平衡的二叉搜索树
平衡二叉搜索树(英语:Balanced Binary Tree)是一种结构平衡的二叉搜索树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
1.6.22-3-4树
在普通的二叉查找树上进行了扩展,它允许有多个键(1~3个)
树保持完美平衡
完美平衡?根到每个叶子结点的路径都是一样长滴。
每个结点可以拥有1, 2, 或者3个键。
2-node:1个键,两个孩子
3-node:2个键,三个孩子
4-node:3个键,四个孩子
1.6.2.1查找操作
查找
和当前结点的所有的键进行比较
如果当前结点中没有,就找到对应的区间
依据链接找到下一个结点 (递归)
1.6.2.2插入操作
分裂节点的办法: 自底向上分裂
另一种分裂方式: 自上向底分裂 (遇到四节点(3个key)先向上分裂, 再向下添加)
Note:这些变换都是局部变换,不会影响到无关的其他结点