Map的实现

来源:互联网 发布:mac appstore 换帐号 编辑:程序博客网 时间:2024/05/18 19:18
刚看完了Containers,为了加深认识,我自己写了一个专门针对String的Map,本想使代码比HashMap更快,没想到比HahhMap慢了不少,把代码给出来先,有时间再想想怎么提高效率
+-------------------------------------Code--------------------------------------------------+
import java.util.*;
class Members
{
 static int id=0;
 String key;
 String value;
 Members(String key,String value){
  this.key=key;
  this.value=value;
  id+=1;
 }
 public boolean equals(Object m){
  boolean b=false;
  if((m instanceof Members)&&(((Members)m).key!=null)){
    if(key==((Members)m).key)
    b=true;
  }
  if((m instanceof Members)&&(value==((Members)m).value))
          b=true;
  return b;
 }
 public String toString(){
  return "key"+key+"value"+value;
 }
 public String getValue(){
  return this.value;
 }
}
public class MyMap
{
 int SZ=100;
 ArrayList[] bucket=new ArrayList[SZ];
 public String put(String key,String value){//ok
  String result=null;
  int index=key.hashCode()%SZ;
  if(index<0)index=-index;
  if(bucket[index]==null)
   bucket[index]=new ArrayList();
  ArrayList al=bucket[index];
  ListIterator li=al.listIterator();
  Members mem=new Members(key,value);
  boolean find=false;
  while(li.hasNext()){
   Members im=(Members)li.next();
   if(im.equals(mem)){
   result=im.getValue();
   li.set(mem);
   find=true;
   break;
   }
  }
  if(!find)
      bucket[index].add(mem);
 return result;
 }
 public boolean containsKey(String key){//ok
  boolean b=false;
  int index=key.hashCode()%SZ;
  if(index<0)index=-index;
  if(bucket[index]==null)
   return b;
  ArrayList al=bucket[index];
  ListIterator li=al.listIterator();
  Members ikey3=new Members(key ,null);
  while(li.hasNext()){
   Members ikey2=(Members)li.next();
   if (ikey2.equals(ikey3))
    b=true;
  }
  return b;
 }
 public boolean containsValue(String value){//ok
  boolean b=false;
  Members ikey4=new Members(null,value);
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null){
   ListIterator fli=bucket[i].listIterator();
   while(fli.hasNext()){
    Members ikey5=(Members)fli.next();
    if(ikey5.equals(ikey4))
    b=true;
   }
  }
  }
  return b;
   
 }
 public void clear(){//ok
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null)
   bucket[i]=new ArrayList();
  }
 }
 public String get(String key){//ok
  String re=null;
  Members mm=new Members(key,null);
  int index=key.hashCode()%SZ;
  if(index<0)index=-index;
  ListIterator gli=bucket[index].listIterator();
  while(gli.hasNext()){
   Members m=(Members)gli.next();
   if(mm.equals(m))
   re=m.getValue();
  }
  return re;
 }
 public String remove(String key){//ok
  String re=null;
  int index=key.hashCode()%SZ;
  Members mm=new Members(key,null);
  if(index<0)index=-index;
  ListIterator rli=bucket[index].listIterator();
  while(rli.hasNext()){
   Members m=(Members)rli.next();
   if(mm.equals(m))
   re=m.getValue();
   m.value=null;
  }
  return re;
 }
 public int size(){//ok
  int size=0;
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null){
   ListIterator sli=bucket[i].listIterator();
   while(sli.hasNext()){
   Members next=(Members)sli.next();
    size+=1;
   }
  }
  }
  return size;
 }
 public Set entrySet(){//ok
  HashSet set=new HashSet();
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null){
   ListIterator sli=bucket[i].listIterator();
   while(sli.hasNext()){
   Members next=(Members)sli.next();
   set.add(new Members(next.key,next.value));
   }
  }
  }
  return set;
 }
 public Set keySet(){//ok
  HashSet set=new HashSet();
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null){
   ListIterator sli=bucket[i].listIterator();
   while(sli.hasNext()){
   Members next=(Members)sli.next();
   set.add(next.key);
   }
  }
  }
  return set;
 }
 public Collection values(){//ok
  ArrayList values=new ArrayList();
  for(int i=0;i<bucket.length;i++){
   if(bucket[i]!=null){
   ListIterator sli=bucket[i].listIterator();
   while(sli.hasNext()){
   Members next=(Members)sli.next();
   values.add(next.value);
   }
  }
  }
  return values;
 }
 public void putAll(Map m){//ok
  Iterator it=m.entrySet().iterator();
  while(it.hasNext()){
   Map.Entry me=(Map.Entry)it.next();
   put((String)me.getKey(),(String)me.getValue());
  }
 }
}