龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java 2中的Collections框架 -- Map

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
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); pub

  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;
  }
  }
  
精彩图集

赞助商链接