| |
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; } }
|
|