Map.Entry使用解读及其在哈希表的遍历中的应用
在北京百分点科技笔试的时候,有一道算法设计题目:写一个算法,遍历哈希表,并输出相应的key,value值。当时答的不是很好,事后上网查了下资料,整理成下篇文章,供以后参考学习。
一、Map.Entry使用解读
1.Map.Entry说明
Map是java中的接口,而Map.Entry是Map的一个内部接口。
Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合(键值对集合),此集合的类型为Map.Entry。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
2.Map.Entry使用
你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息。
标准的Map访问方法如下:
Map map = new HashMap();
Set keys = map.keySet( );//keySet返回的是Map中key的集合
if(keys != null) {
Iterator iterator = keys.iterator( );
while(iterator.hasNext( )) {
Object key = iterator.next( );
Object value = map.get(key);
;....
;}
}
然而,这个方法有一个问题:从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。
幸运的是,这里还有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:
Map map = new HashMap();
Set entries = map.entrySet( );
if(entries != null) {
Iterator iterator = entries.iterator( );
while(iterator.hasNext( )) {
Map.Entry entry =iterator.next( );
Object key = entry.getKey( );
Object value = entry.getValue();
;....
}
}
或者:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此类型的遍历哈希表的方式!尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。
二、Map.Entry在哈希表的遍历中的应用
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapTable {
public static void main(String[] args) {
Map map = new HashMap();
Hashtable table = new Hashtable();
map.put("map_key_1", "value_1");
map.put( "map_key_2", null);
table.put("table_key_1", "table_value_1");
table.put("table_key_2", "table_value_2");
//table.put("table_key_3", null); /**table中允许有null( key和value中任一)*/
Set map_ety = map.entrySet();
//HashMap 和Hashtable 中元素在遍历的时候是后进先出,栈的结构
for(Iterator iter = map_ety.iterator(); iter.hasNext(); ){
Map.Entry ety = (Map.Entry)iter.next();
System.out.println(ety.getKey() + "====" + ety.getValue());
}
for( Enumeration e = table.keys(); e.hasMoreElements(); ){
String key = (String)e.nextElement();
System.out.println( key + "=====" + table.get(key));
}
}
}
运行结果:
map_key_2====null
map_key_1====value_1
table_key_2=====table_value_2
table_key_1=====table_value_1