HashMap底层实现了哈希表,非常重要的数据结构。
哈希表的基本结构是 数组+链表
取数据过程:
1、获得key的hashcode,通过hash()散列算法得到hash值,进而定位到数组的位置。
2、在链表上挨个比较key对象,调用equals()方法,将key对象和链表上所有节点的key对象进行比较,直到碰到返回true的节点对象为止。
3、返回equals()为true的节点对象的value对象。
两个内容相同的equals方法为true的对象必须是相等的hashcode。
手动实现Map:put存储键值对
package cn;
import javax.xml.soap.Node;
public class TestMap{
Node2[] table ;//位桶数组
int size;
public TestMap() {
table = new Node2[16];//长度一般定义成2的整数幂
}
public void put(Object key,Object value){
//定义新的节点对象
Node2 newNode = new Node2();
newNode.hash = myHash(key.hashCode(),table.length);
newNode.key = key;
newNode.value = value;
newNode.next = null;
Node2 temp = table[newNode.hash];
if(temp == null){
table[newNode.hash] = newNode;
}
}
public int myHash(int v,int length){
System.out.println("hash in myhash" + (v & (length -1))); //直接位运算
System.out.println("hash in myhash"+ (v%(length-1)));
return v & (length -1 );
}
public static void main(String args[]){
TestMap t = new TestMap();
t.put(10,"aa");
t.put(11,"bb");
t.put(12,"cc");
}
}
重写toString方法:
@Override
public String toString() {
StringBuilder sb = new StringBuilder("{");
for(int i =0;i<table.length;i++){
Node2 temp = table[i];
while(temp!=null){
sb.append(temp.key + ":" + temp.value);
temp = temp.next;
}
}
sb.setCharAt(sb.length()-1,'}');
return sb.toString();
}
增加对应的get方法:
public Object get(Object key){
int hash = myHash(key.hashCode(),table.length-1);
Object value = null;
if(table[hash] !=null){
Node2 temp = table[hash];
while(temp !=null){
if(temp.key.equals(key)){
value = temp.value;
break;
}else{
temp = temp.next;
}
}
}
return value;
}