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;
}
}
闽公网安备 35060202000074号