服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java 2中的collections框架 -- map


  public interface java.util.map {
  
    //altering methods
     public object put(object key, object value);  
     public object remove(object key);       
     public void putall(java.util.map);      
     public void clear(); 
  
    //querying methods
     public object get(object key);     
     public int size();          
     public boolean isempty();         
     public boolean containskey(object);     
     public boolean containsvalue(object);     
     public boolean equals(object);        
  
    //viewing methods
     public java.util.set keyset();         //gets keys
     public java.util.collection values();      //gets values
     public java.util.set entryset();        //gets mappings
  
     public static interface java.util.map.entry {  //a map-entry (single key/value pair)
       public object getkey();          //returns current entry key
       public object getvalue();         //returns current entry value
      public object setvalue(object value);   
   public boolean equals(object);      
   public int hashcode();             }
  }
  map接口提供了方便易用的方法,通过这些方法可以查询、查看、修改当前map的内容。注意对于map接口的keyset()方法返回一个set,set是collection接口的一个扩展,包含不重复的一组对象。因为map中的key是不可重复的,所以得到所有key的keyset()方法返回一个set对象。map接口本身还包含了一个map.entry接口,一个map.entry就是map中的一个关键字/值对。map接口中的entryset()方法就返回了一个集合对象,其中每一个元素都实现了map.entry接口。map接口的get(object key),put(object key,object value),和remove(object key)方法都有同一个问题。他们的返回类型都是object,当返回null时,可以猜测为调用那个方法前那个key不存在。但是只有在null不允许作为map的值时可以这样猜测。所有map接口的通用实现都允许null作为key或者value,这就说当返回一个null值,就可以意味着很多事情。只是因为通用实现允许null值,你不能下那个映射有null值的结论。如果你确知没有null值,那返回null值就意味着调用那个方法前,映射里并没有那个键。否则,你必须调用containskey(object key)来看看那个key是否存在。
  
  hashtable
  
  java.util.hashtable实现了map接口,在hashtable中使用key对象的hashcode()作为对应的对象的相对存储地址,以便实现根据关键字快速查找对象的功能。所以只有一个实现了hashcode()和equals()方法的对象才可作为hashtable的key。null值不能作为关键字或值。
  public class java.util.hashtable extends dictionary implements cloneable, map, serializable {
  
     //hashtable constructors
     //construct a default hashtable with default capacity and load of 0.75
     public hashtable();          
     //construct a hashtable with passed capacity and default load of 0.75
     public hashtable (int initialcapacity);
     //construct hashtable with passed capacity and load
     public hashtable(int initialcapacity, float load);
     //construct hashtable with passed mapping
     public hashtable(map);         
    
     //hashtable specific methods
     //checks if object is in hashtable
     public boolean contains(object);    
     //returns enumeration of elements in hashtable
     public enumeration elements();     
     //returns enumeration of keys in hashtable
     public enumeration keys();       
     //creates shallow copy of hashtable(structure copied, but not key/values)
     public object clone();         
     //prints out key/value pairs of hashtable elements
     public string tostring();       
     //reorganizes all elements in hashtable, and increases hashtable capacity
     protected void rehash();        
    
     //get value from passed in key
     public object get(object);       
     //insert key/value pair
     public object put(object key, object value);   
  
  }
  hashtable是java 2集合框架推出之前的一个老的工具类,在新的java 2集合框架下,已经被hashmap取代。hashtable和hashmap的区别主要是前者是同步的,后者是快速失败机制保证不会出现多线程并发错误(fast-fail)。在初始化一个hashtable时,可以指定两个参数:初始容量、负荷,这两个参数强烈的影响着hashtable的性能。容量是指对象的个数,负荷是指散列表中的实际存储的对象个数和容量的比率。如果初始容量太小,那么hashtable需要不断的扩容并rehash(),而这是很耗时的;如果初始容量太大,又会造成空间的浪费。负荷则相反,负荷太小会造成空间浪费,负荷太大又会耗时(因为这会造成较多的关键字的散列码重复,hashtable使用一个链接表来存储这些重复散列码的对象)。容量的缺省值是11,负荷的缺省值是0.75,一般情况下你都可以使用缺省值来生成一个hashtable。另外,在hashtable中的大部分的方法都是同步的。
  
  hashmap
  
  hashmap基本实现了map接口的全部方法。方法的签名大家看上面的map接口。这儿主要说说几个map接口中的方法。
  按照集合框架的实现,哈希表是单链表作为元素的数组,有着同样索引值的两个或更多入口被一起链结到单链表中。哈希表声明如下:
    private entry[] table;
  组件类型entry是map.entry接口的实现,map.entry声明于map接口内。下边是map.entry接口的简化实现:
    private static class entry implements map.entry{
      int hashcode;
      object key;
      object value;
      entry next;
  
      entry(int hashcode,object key,object value,entry next){
        this.hashcode=hashcode;
        this.key=key;
        this.value=value;
        this.next=next;
  }
  public object getkey(){
    return key;
  }
  public object getvalue(){
    return value;
  }
  public object setvalue(object value){
    object oldvalue=this.value;
    this.value=value;
    return oldvalue;
  }
  }

扫描关注微信公众号