链地址法
package aday;
import java.util.Iterator;
import java.util.LinkedList;
public class MyHashMap {
private class Pair{
private int key;
private int value;
private Pair(int key, int value) {
this.key = key;
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
}
private static final int BASE=769;
LinkedList[] data;
/** Initialize your data structure here. */
public MyHashMap() {
data=new LinkedList[BASE];
for (int i = 0; i < data.length; i++) {
data[i]=new LinkedList<Pair>();
}
}
private static int hash(int key){
return key%BASE;
}
/** value will always be non-negative. */
public void put(int key, int value) {
int h=hash(key);
Iterator<Pair> iterator=data[h].iterator();
while (iterator.hasNext()){
Pair pair = iterator.next();
if (pair.getKey()==key){
pair.setValue(value);
return;
}
}
data[h].offerLast(new Pair(key, value));
}
/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
public int get(int key) {
int h=hash(key);
Iterator<Pair> iterator=data[h].iterator();
while (iterator.hasNext()){
Pair pair = iterator.next();
if (pair.getKey()==key){
return pair.getValue();
}
}
return -1;
}
/** Removes the mapping of the specified value key if this map contains a mapping for the key */
public void remove(int key) {
int h=hash(key);
Iterator<Pair> iterator = data[h].iterator();
while (iterator.hasNext()){
Pair pair = iterator.next();
if (pair.getKey()==key){
data[h].remove(pair);
return;
}
}
}
}
**Java Iterator
(**迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet 等集合。
迭代器 it 的两个基本操作是 next 、hasNext 和 remove。
调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext() 用于检测集合中是否还有元素。
调用 it.remove() 将迭代器返回的元素删除。
解析
private static final int BASE=769;
private static int hash(int key){
return key%BASE;
}
质数取模,其实是利用了同余的概念:当元素是个有规律的等差数列时,并且和基数(数组大小)最大公约数不为1时,就会造成哈希映射时冲突变高(数组某些位置永远不会有值)。比如数列0,6,12,18,24,30…,
base为10,取模(0,6,2,8,4,0…)后,放入哈希表中位置将只能在0,2,4,6,8这几个数组位置上;
但我们如果把base取7(数组大小甚至比10小),同样数列取模后(0,6,5,4,3,2,1,0,…),可以分布在哈希表中的0,1,2,3,4,5,6所有位置上;
所以可以使得哈希表中每个位置都有用武之地。
Hash的用途很多,我们在使用Ngnix做负载均衡的时候,同样用的也是Hash的方式。总的来说,要是数据分布均匀一些,在这种时候就可以考虑使用Hash的方式对数据进行处理。