先来用一个例子来解释以下Hash里的映射是如何实现的·。
假设一个数组中存放着1~15这15个数字,现在要存入Hash中,有7个空间,那么我们可以通过一个计算公式来存放
index = number % 7;
完成后的结果就是这样子的,一个索引有可能映射出多个值,我们称之为碰撞。那么我们该如何处理呢?一般有两个方法:开放地址法、链地址法。
1.开放地址法
我们在计算8的地址时,会发现与1产生冲突,这时可以向后寻找为null的地方,将其存进去。例如
2.链地址法
简单说就是将Hash表的每个单元作为一个链表的头节点,有元素要插入时,放到对应链表的尾部即可。
Tips:
数组的长度需为2的n次幂
插入的元素的个数不能超过数组长度的75%
——————————————————————————————————————————
——————————————————————————————————————————
接下来讲一下队列
队列的一大特点就是先进先出。现在就基于链表来实现一下队列。
public class LinkQueue {
static class Node {
public int data;
public Node next;
public Node(int data) {
this.data = data;
}
}
private Node front;
private Node rear;
private int size;
public LinkQueue() {
this.front = new Node(0);
this.rear = new Node(0);
}
//入队
public void push(int val) {
Node newNode = new Node(val);
Node temp = front;
while (temp.next != null){
temp = temp.next;
}
temp.next = newNode;
rear = newNode;
size++;
}
//出队
public int pull(){
if (front.next == null)
System.out.println("队列已空");
Node firstNode = front.next;
front.next = firstNode.next;
size--;
return firstNode.data;
}
//遍历
public void traverse(){
Node temp = front.next;
while (temp != null){
System.out.println(temp.data + "\t");
temp = temp.next;
}
}
}