Java 2中的Collections框架 -- Map

博客主要提及了Hashtable和HashMap。这两者在Java编程中较为常见,是数据存储相关的内容,与多线程等技术也可能存在关联,在开发中有着重要作用。
在Java2的Collections框架中,主要包括两个接口及其扩展和实现类:Collection接口和Map接口。两者的区别在于前者存储一组对象,后者则存储一些关键字/值对。

publicinterfacejava.util.Map{

//AlteringMethods
publicObjectput(Objectkey,Objectvalue);
publicObjectremove(Objectkey);
publicvoidputAll(java.util.Map);
publicvoidclear();

//QueryingMethods
publicObjectget(Objectkey);
publicintsize();
publicbooleanisEmpty();
publicbooleancontainsKey(Object);
publicbooleancontainsValue(Object);
publicbooleanequals(Object);

//ViewingMethods
publicjava.util.SetkeySet();//Getskeys
publicjava.util.Collectionvalues();//Getsvalues
publicjava.util.SetentrySet();//Getsmappings

publicstaticinterfacejava.util.Map.Entry{//amap-entry(singlekey/valuepair)
publicObjectgetKey();//returnscurrententrykey
publicObjectgetValue();//returnscurrententryvalue
publicObjectsetValue(Objectvalue);
publicbooleanequals(Object);
publicinthashCode();}
}
Map接口提供了方便易用的方法,通过这些方法可以查询、查看、修改当前Map的内容。注意对于Map接口的keySet()方法返回一个Set,Set是Collection接口的一个扩展,包含不重复的一组对象。因为Map中的key是不可重复的,所以得到所有key的keySet()方法返回一个Set对象。Map接口本身还包含了一个Map.Entry接口,一个Map.Entry就是Map中的一个关键字/值对。Map接口中的entrySet()方法就返回了一个集合对象,其中每一个元素都实现了Map.Entry接口。Map接口的get(Objectkey),put(Objectkey,Objectvalue),和remove(Objectkey)方法都有同一个问题。他们的返回类型都是Object,当返回null时,可以猜测为调用那个方法前那个key不存在。但是只有在null不允许作为Map的值时可以这样猜测。所有Map接口的通用实现都允许null作为key或者value,这就说当返回一个null值,就可以意味着很多事情。只是因为通用实现允许null值,你不能下那个映射有null值的结论。如果你确知没有null值,那返回null值就意味着调用那个方法前,映射里并没有那个键。否则,你必须调用containsKey(Objectkey)来看看那个Key是否存在。

Hashtable


java.util.Hashtable实现了Map接口,在Hashtable中使用key对象的hashCode()作为对应的对象的相对存储地址,以便实现根据关键字快速查找对象的功能。所以只有一个实现了hashCode()和equals()方法的对象才可作为Hashtable的key。null值不能作为关键字或值。
publicclassjava.util.HashtableextendsDictionaryimplementsCloneable,Map,Serializable{

//Hashtableconstructors
//constructadefaultHashtablewithdefaultcapacityandloadof0.75
publicHashtable();
//constructaHashtablewithpassedcapacityanddefaultloadof0.75
publicHashtable(intinitialCapacity);
//constructHashtablewithpassedcapacityandload
publicHashtable(intinitialCapacity,floatload);
//constructHashtablewithpassedmapping
publicHashtable(Map);

//Hashtablespecificmethods
//checksifObjectisinHashtable
publicbooleancontains(Object);
//returnsEnumerationofelementsinHashtable
publicEnumerationelements();
//returnsEnumerationofkeysinhashtable
publicEnumerationkeys();
//createsshallowcopyofHashtable(structurecopied,butnotkey/values)
publicObjectclone();
//printsoutkey/valuepairsofHashtableelements
publicStringtoString();
//reorganizesallelementsinHashtable,andincreasesHashtablecapacity
protectedvoidrehash();

//getValuefrompassedinkey
publicObjectget(Object);
//insertkey/valuepair
publicObjectput(Objectkey,Objectvalue);

}
Hashtable是Java2集合框架推出之前的一个老的工具类,在新的Java2集合框架下,已经被HashMap取代。Hashtable和HashMap的区别主要是前者是同步的,后者是快速失败机制保证不会出现多线程并发错误(Fast-Fail)。在初始化一个Hashtable时,可以指定两个参数:初始容量、负荷,这两个参数强烈的影响着Hashtable的性能。容量是指对象的个数,负荷是指散列表中的实际存储的对象个数和容量的比率。如果初始容量太小,那么Hashtable需要不断的扩容并rehash(),而这是很耗时的;如果初始容量太大,又会造成空间的浪费。负荷则相反,负荷太小会造成空间浪费,负荷太大又会耗时(因为这会造成较多的关键字的散列码重复,Hashtable使用一个链接表来存储这些重复散列码的对象)。容量的缺省值是11,负荷的缺省值是0.75,一般情况下你都可以使用缺省值来生成一个Hashtable。另外,在Hashtable中的大部分的方法都是同步的。

HashMap


HashMap基本实现了Map接口的全部方法。方法的签名大家看上面的Map接口。这儿主要说说几个Map接口中的方法。
按照集合框架的实现,哈希表是单链表作为元素的数组,有着同样索引值的两个或更多入口被一起链结到单链表中。哈希表声明如下:
privateEntry[]table;
组件类型Entry是Map.Entry接口的实现,Map.Entry声明于Map接口内。下边是Map.Entry接口的简化实现:
privatestaticclassEntryimplementsMap.Entry{
inthashCode;
Objectkey;
Objectvalue;
Entrynext;

Entry(inthashCode,Objectkey,Objectvalue,Entrynext){
This.hashCode=hashCode;
This.key=key;
This.value=value;
This.next=next;
}
publicObjectgetKey(){
returnkey;
}
publicObjectgetValue(){
returnvalue;
}
publicObjectsetValue(Objectvalue){
ObjectoldValue=this.value;
This.value=value;
ReturnoldValue;
}
}

SortedMap是Map接口的子接口,SortedMap的标准实现是TreeMap,实现了一个排序的Map。这儿不再做说明。本站翻译的《Java规则》(JavaRules)中对Java2的集合框架有深入的研究。本文限于篇幅,只及皮毛。有兴趣的朋友,请参考Java2源码中的集合实现代码和APIdoc。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值