电脑技术学习

java的Collections框架的理解

dn001
内容: 在Java 2的Collections框架中,主要包括两个接口及其扩展和实现类:Collection接口和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;
}
}


SortedMap是Map接口的子接口,SortedMap的标准实现是TreeMap,实现了一个排序的Map。
这里翻译的是对《Java 规则》(Java Rules)中对Java2的集合框架的研究。
详细可以参考Java2源码中的集合实现代码和API doc。





Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd

标签: