Java中的Map接口,底层实现是数组+链表。
数组中存储一个链表对象。
链表里再存放Key-value对象。
容器类对象在调用remove、contains等方法时,需要比较对象是否相等,这涉及到对象类型的equals()方法和hashcode()方法。
对于自定义类型,需要重写equal()和hashCode()方法。
Java中规定,两个内容相等的对象,应该具有相等的hashcode。
package cn.zhouxj.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
*自定义Map的升级版,尽量避免循环遍历
* 提高查询的效率
*/
public class MyMap001 {
LinkedList[] arr = new LinkedList[999] ;//定义一个数组,数组里存放的是链表,链表里存放键值对
int size;
public void put(Object key,Object value){
KeyValue kv = new KeyValue(key,value);
int a = key.hashCode()%arr.length;//需要考虑哈希冲突
if(arr[a]==null){
//新建一个list对象
LinkedList list = new LinkedList();
arr[a] = list;
list.add(kv);
}else{
LinkedList list= new LinkedList();
arr[a]=list;
for(int i=0;i<list.size();i++){
KeyValue kvtmp = (KeyValue)list.get(i);
if(kvtmp.key.equals(key)){
kvtmp.value = value;//键值重复,直接覆盖
return;
}
}
arr[a].add(kv);
}
}
public Object get(Object key){
int a = key.hashCode()%arr.length;
if(arr[a]!=null){//不等于null,说明存在list,需要遍历list
LinkedList list = new LinkedList();
list = arr[a];
//遍历list中所有的key
for(int i =0;i<list.size();i++){
KeyValue kv =(KeyValue)list.get(i);
if((kv.key).equals(key)){
return kv.value;
}
}
}
return null;
}
public static void main(String[] args){
MyMap001 m = new MyMap001();
m.put(1,2);
m.put("qwe",2);
m.put("qwe",3);
System.out.println(m.get("qwe"));
}
}