散列表介绍:数组
数组和链表均可以是有序的(即存储顺序与取出顺序一致),但这样是有代价的,须要遍历才能够寻找某一特定元素;函数
而还有另外的一些存储结构:不在乎元素的顺序,可以快速的查找元素的数据spa
其中就有一种很是常见的:散列表设计
散列表为每一个对象计算出一个整数,称为散列码。根据这些计算出来的整数(散列码)保存在对应的位置上!3d
在Java中,散列表用的是链表数组实现的,每一个列表称之为桶。code
一个桶上可能会遇到被占用的状况(hashCode散列码相同,就存储在同一个位置上),这种状况是没法避免的,这种现象称之为:散列冲突对象
若是散列表太满,是须要对散列表再散列,建立一个桶数更多的散列表,并将原有的元素插入到新表中,丢弃原来的表~blog
平衡树:知足平衡条件的树;排序
AVL树,带有平衡条件的二叉排序树(平衡条件:每一个节点的左子树和右子树的高度最多差 1);索引
红黑树:
在2-3树的理论基础上发明了红黑树(2-3-4树也是一样的道理,只是2-3树是最简单的一种状况,因此我就不说2-3-4树了)。
红黑树是对2-3查找树的改进,它能用一种统一的方式完成全部变换。
红黑树用的是也是两种方式来替代2-3树不断的节点交换操做:
红黑树为了保持平衡,还有制定一些约束,遵照这些约束的才能叫作红黑树:
咱们知道Hash存储的底层是散列表,而在Java中散列表的实现是经过数组+链表的~我
咱们能够简单总结出HashMap:
咱们是根据key的哈希值来保存在散列表中的,咱们表默认的初始容量是16,要放到散列表中,就是0-15的位置上。也就是tab[i = (n - 1) & hash]
。能够发现的是:在作&
运算的时候,仅仅是后4位有效~那若是咱们key的哈希值高位变化很大,低位变化很小。直接拿过去作&
运算,这就会致使计算出来的Hash值相同的不少。
而设计者将key的哈希值的高位也作了运算(与高16位作异或运算,使得在作&运算时,此时的低位其实是高位与低位的结合),这就增长了随机性,减小了碰撞冲突的可能性!