对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);
}
- 对HashMap的“操”作
- 自 动 操 作
- QT 数据操 作
- Java对MongoDB的基础操做
- 多线程环境下操作HashMap的问题
- 关 于 PV 操 作
- 关 于 PV 操 作
- 关 于 PV 操 作
- 关 于 PV 操 作
- 关 于 PV 操 作
- 关 于 PV 操 作
- hashmap与hashtable的区别,以及实现hashmap的同步操
- 用ADO类操ACCESS作数据库的介质损耗监控软件
- C!#!中!操!作!W!M!I!的!类!库!简!介
- 第13章 文 件 操 作
- re-dis 操-作-配-置
- SQLSERVER2008备份对日志文件的操…
- Win 32 API中对文件的操
- 【洛谷P1378】油滴扩展
- schema、dtd、xml之间的关系
- Android DiskLruCache完全解析,硬盘缓存的最佳方案(转)
- 时间管理
- 命令行shell 用于SQLite
- 对HashMap的“操”作
- c语言:新颖的进制灵活应用
- 8/4 ?= 2
- 黑马程序员——Java基础---面向对象
- BFS、DFS——机器人的运动范围
- 开始便持久 or 绑定共生死
- HTML学习3-超链接标签
- JQuery对象与DOM对象
- SpringMVC学习笔记(5):绑定数据(3)