对HashMap的“操”作

来源:互联网 发布:windows正版好处 编辑:程序博客网 时间:2024/04/29 18:31

今天讲解的主要是使用多种方式来实现遍历HashMap取出Key和value。


首先在java中如果想让一个集合能够用for增强来实现迭代,那么此接口或类必须实现Iterable接口。Iterable究竟是如何来实现迭代的,下面我们来讲解一下Iterable。


Iterable

Iterator是迭代器类,而Iterable是接口。 好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。一般都是结合着用,比如HashMap类就实现了Iterable接口,而要访问或打印出Map中所有内容时,就可以这样:

/*错误示例*/

HashMap hashMap; 

Iterator iter = hashap.iterator(); 

while(iter.hashNext()) { 

  String s = iter.next(); 

正确示例:

Map hashMap=new HashMap();

hashMap.put("1", "乔峰");

/*

* 方式1

*/

Iterator iter = hashMap.entrySet().iterator();

while (iter.hasNext()) {

    Map.Entry entry = (Map.Entry) iter.next();

    Object key = entry.getKey();

    Object val = entry.getValue();

}

/*

* 方式2

*/

Iterator itr=hashMap.keySet().iterator();

while(itr.hasNext()){

Object key=itr.next();

Object val=hashMap.get(key);

System.out.println("key:"+key+"value:"+val);


为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? 

看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。仔细想一下这么做是有道理的。 因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。 而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。 


下面主要讲解一下遍历过程。

//定义一个泛型集合

Map<String, String> map = new HashMap<String, String>();

//通过Map的put方法向集合中添加数据        

map.put("1", "乔峰");        

map.put("2", "虚竹");        

map.put("3", "段誉");


使用该Map接口的KeySet方法来实现

我们都知道Map接口并没有实现Iterable接口,为什么能用他的KetSet方法就能实现迭代呢?

因为KeySet方法返回此映射中包含的键的 Set 视图,这个方法竟然能返回一个Set试图,也就说他的返回值类型是一个Set接口,我们可以通过API文档看到Set接口他是实现了Iterable接口,所以能实现迭代。

//调用KeySet方法放回一个Set接口类型        

Set<String> set = map.keySet();        

//使用for增强来取出key和value        

for (String item : set) {            

    System.out.println("Key是:" + item + ";Value值是:" + map.get(item));        

}



使用Map接口的Values方法实现(for增强)

同理:调用Map接口的values方法他放回一个Collection试图,Collection接口他又实现了Iterable接口,所以能够迭代。

Collection<String> con = map.values();        

for (String item : con) {

    System.out.println("Value值是:" + item);       

}



使用Map接口的entrySet方法实现(for增强)

entrySet:entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry,Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。

Set<Entry<String, String>> setentry = map.entrySet();

for (Entry<String, String> item : setentry) {

    System.out.println("Key是:" + item.getKey()+";Value是:"+item.getValue());

}


使用Map接口的keySet().Iterable()(while循环)

Iterable():返回在此 set 中的元素上进行迭代的迭代器。返回的元素没有特定的顺序(除非此 set 是某个提供顺序保证的类的实例)。返回值类型

Iterator<E> Iterator<String> it = map.keySet().iterator();

//如果仍有元素可以迭代,则返回 true。        

while (it.hasNext()) {

    //获取Key值      

    String key = it.next();

    System.out.println("Key是:" + key + ";Value值是:" + map.get(key));     

}


使用Map接口的value.Iterable()(while循环)

Iterator<String> it = map.values().iterator();        

while (it.hasNext()) {            

    String value = it.next();            

    System.out.println("Value值是:" + value);        

}


使用Map接口的entrySet().Iterable()(while循环)

Iterator<Entry<String, String>> it = map.entrySet().iterator();        

 while(it.hasNext()){

   Map.Entry<String, String> me = it.next();

   String key = me.getKey();  

   String value = me.getValue();  

   System.out.println("Key值是:"+key+"Value值是:"+value); 

  }


0 0
原创粉丝点击