自定义Map类的版本SxtMap

来源:互联网 发布:c语言基础 编辑:程序博客网 时间:2024/06/06 01:34

Map 的底层实现:链表+数组

就是余数相同的放在a[0]用链表连起来a[1],a[2],这样在形成一个数组,链表数组

public class SxtMap002 {
LinkedList[] arr=new LinkedList[999];//链表数组,map的底层实现:链表加数组
int size;
public void put(Object key,Object value){
SxtEntry e=new SxtEntry(key,value);
int hash=key.hashCode();
hash=hash<0?-hash:hash;//不让hash为负数
int a=hash%arr.length;//hash取余则是0-999
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++){
SxtEntry e2=(SxtEntry)list.get(i);
if(e2.key.equals(key)){
e2.value=value;//键值重复直接覆盖
return;
}
}
arr[a].add(e);
}
}
public Object get(Object key){
int a=key.hashCode()%arr.length;
if(arr[a]!=null){
LinkedList list=arr[a];
for(int i=0;i<list.size();i++){
SxtEntry e=(SxtEntry)list.get(i);
if(e.key.equals(key)){
return e.value;
}
}
}
return null;
}
public static void main(String[] args) {
SxtMap002 m=new SxtMap002();
m.put("张三",new Wife("杨幂"));
m.put("李四",new Wife("王菲"));
m.put("李四",new Wife("杨幂"));
Wife w=(Wife)m.get("张三");
System.out.println(w.name);
}


}
class Wife{
String name;
public Wife(String name){
this.name=name;
}
}
class SxtEntry{
Object key;
Object value;
public SxtEntry(Object key,Object vlaue){
this.key=key;
this.value=vlaue;
}
public SxtEntry(){

}

}


一个高效检索节点的代码

public Node node(int index){

Node temp=null;//临时变量

if(first!=null){

if(index<(size>>1)){

temp=first;

for(int i=0;i<index;i++){

temp=temp.next;

}

}

else{

temp=last;

for(int i=size-1;i>index;i--){

temp=temp.previous;

}

}

}

return temp;

}


原创粉丝点击