HashMap
散列法(Hashing): 将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法
由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。
1.HashMap 概念 和 底层结构
HashMap是基于 哈希表 的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null 值 和 null 键。HashMap 存储的是键值对,HashMap很快,但是不保证映射的顺序,特别是它不保证改顺序不变;
HashMap 实际上是一个“链表散列”的数据结构,即 数组 和 链表 的结合体。
数组: 存储区间连续,占用内存严重,寻址容易,插入删除困难;
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易;
HashMap综合应用了这两种数据结构,寻址容易,插入删除容易;
1.1 HashMap的基本存储原理以及存储内容的组成
基本原理:
声明一个下标范围比较大的数组来存储元素;
设计一个哈希函数来获取每一个元素的Key(关键字)的函数值(数组下标, hash值)相对应
数组存储的元素的一个Entry类,这个类有三个数据域,key、value、next(指向下一个Entry)
1.2 HashMap 的工作原理以及储存方法过程
HashMap的工作原理 :HashMap是基于散列法(又称哈希法hashing)的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。
当我们给put()方法传递键和值时,我们先对 键(Key)调用hashCode() 方法,返回hashCode用于找到bucket(桶)位置来存储Entry对象
判断键值对数组table[i]是否为null,为null则执行resize() 扩容;
根据Key获取hash值得到插入的数组索引i,如果table[i] = null,直接新建节点添加,转向第6,否则转向第3;
判断table[i] 的首个元素是否和Key(Entry 里存放 “value + Key” ,但是Entry的索引 i 是key的hash值)一样,如果相同直接覆盖value;否则继续 第4步(注:这里的相同指的是hashCode 以及equals)
判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对 , 否则继续走第5部
遍历table[i],判断链表长度是否>8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历中发现key以及存在直接覆盖value
插入成功后,判断实际存在的键值对数量size是否超过了最大容量,超过了则扩容;
1.3 HashMap 数据结构
https://www.cnblogs.com/skywang12345/p/3310835.html
HashMap是通过“拉链法”实现的哈希表。它包括几个重要成员变量
table: 是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的“key-value键值对”都是存储在Entry数组中。
size:HashMap的大小,它是HashMap保存的键值对的数量。
threhold:HashMap 的阈值,用于判断是否需要调整HashMap的容量。threshold的值= “容量*加载因子”,当HashMap中存储数据的数量达到threshold时,HashMap的容量就加倍;
loadFactor:加载因子
modCount: 用来实现fail-fast机制
1.4 Hash冲突
哈希表的特点:关键字和它在表中存储位置之间存在一种函数关系。这个函数我们称为为哈希函数(简单的说就是一种将任意长度的消息压缩到固定长度的消息的函数。)
hash冲突:就是 键(key)经过hash函数得到的结果作为地址去存放当前的键值对(key-value)(这个是hashmap的存值方式),但是却发现该地址已经有人先来了,一山不容二虎,就会产生冲突。这个冲突就是hash冲突了。
一句话说就是:如果两个不同对象的hashCode相同,这种现象称为hash冲突。
- 红黑树
http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。
2.1 二叉查找树
2.2 红黑树
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。
关于红黑树的演变
https://blog.csdn.net/chen_zhang_yu/article/details/52415077