哈希概念
哈希也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。
哈希存储
现在有1,2,3…15,要将其存储到大小为7的哈希表中,应该如何存储
首先选择哈希函数 index = number % 7
通过哈希函数,可以将要存储的数据映射为对应的下标。
结果如图所示
哈希冲突
很明显,按照上面的哈希函数进行存储会出现碰撞,即不同的输入经过散列函数得到的输出是相通的。很明显数组的同一位置不能存储两个元素。应该如何解决呢
处理方法
开放定址法
一旦发生冲突,就去寻找下一个散列地址,只要散列表足够大,总能找到空的散列地址,并将记录录入。
链地址法
将哈希表的每个单元作为链表的头节点,所有哈希地址为i的元素构成一个链表,形成数组➕链表的形式,HashMap的JDK7就是如此,在JDK8改成数组➕链表➕红黑树的形式,做了进一步优化。
队列概念
队列也是访问受限的线性表,遵循先入先出规则,即先入队的元素先出队,后入队的元素后出队。队列同样可以使用数组和链表实现。下面是链表实现队列的方式
public class ListQueue {private Node front;private Node rear;private Integer size;public ListQueue() {front = new Node(-1);rear = new Node(-1);size = 0;}public void push(int value) {Node node = new Node(value);Node iter = front;while (iter.next != null) {iter = iter.next;}iter.next = node;rear = node;size++;}public int pull() {Node node = front.next;if (node == null) {throw new RuntimeException("队列已空");}front = node.next;size--;return node.data;}public int getLength(){return size;}
}class Node {int data;Node next;public Node(int data) {this.data = data;}
}