数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。
要综合两者的特性,就有了哈希表。哈希表有多种不同的实现方法,最经典的一种方法 —— 拉链法。
哈希表可以理解为链表的数组。主干为数组,数组的每一个成员是链表。该数据结构所容纳的所有元素均包含一个指针,用于元素间的链接。我们根据元素的自身特征把元素分配到不同的链表中去,反过来我们也正是通过这些特征找到正确的链表,再从链表中找出正确的元素。其中,根据元素特征计算元素数组下标的方法就是哈希算法。
节点类中需要的属性key,value,指向下一个节点
节点类
public class Node{
private Object key;
private Object value;
private Node next;
public Node(){
}
public Node(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
public Node getNext(){
return next;
}
public void setKey(String s){
this.key=s;
}
public void setValue(Object value){
this.value=value;
}
public Object getKey() {
return key;
}
public Object getValue() {
return value;
}
}
主要实现
hash.hashCode() :返回int类型
hash.put(Object key, Object value)
hash.get(Object key)返回key值对应的value
hash.remove(key) 返回对应的value
hash.replace(key, value) 返回boolean是否remove成功
hash.size() :返回int类型的存储的节点的个数
hash.containsKey(Object key) :boolean
hash.containsValue(value) :boolean
自定义Map类
public class MyHashMap {
private int size = 8;
private int number = 0;// 存储的节点的个数
private ArrayList<LinkedList> array_head = new ArrayList<LinkedList>(size);
public MyHashMap() {
super();
for (int i = 0; i < size; i++) {
LinkedList list = new LinkedList();// 哈希数组中初始化存储的为空链表头
array_head.add(list);// 初始化的时候就将空节点头添加到数组中去
}
}
/**
* 根据 键值对 生成节点 将节点放入哈希表中
*
* @param key
* 键
* @param value
* 值
*/
public void put(Object key, Object value) {
if (containsKey