在前一篇文章中初步了解了下Map,下面为了更加深入的了解Map,我来写下粗糙的Map源码
1、放入键值对
LinkedList[] arr = new LinkedList[999];
int size;
public void put(Object key,Object value) {
MyEntry e = new MyEntry(key,value);
int hash = key.hashCode();
hash = hash<0 ? -hash:hash; //防止出来的数是个复数,防止出问题
int a = key.hashCode()%arr.length;
if(arr[a] == null) {
LinkedList list = new LinkedList();
arr[a] = list;
list.add(e);
}else {
LinkedList list = arr[a];
for(int i=0;i<list.size();i++) {
MyEntry e1 = (MyEntry) list.get(i);
if(e1.key.equals(key)) {
e1.value = value; //键值重复直接覆盖
}
}
arr[a].add(e);
}
}
分析:①将键值对存放到链表当中
②将链表存放在数组中
2、通过key找value
public Object get(Object key) {
// return arr[key.hashCode()%999];
int a = key.hashCode()%arr.length;
if(arr[a] != null) { //如果不为空则遍历
LinkedList list = arr[a];
for(int i=0;i<list.size();i++) {
MyEntry e = (MyEntry) list.get(i);
if(e.key.equals(key)) {
return e.value;
}
}
}
return null;
}
分析:遍历找出key,如果key相等则提出value