下面通过例子看看:
Map<String,String> map = new HashMap<String,String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
Collection<String> collection = map.values();//返回值是个值的Collection集合
System.out.println(collection);
打印结果:
[zhangsan, lisi, wangwu]
或者
Map map = new HashMap();
Collection c = map.values();
Iterator iterator = c.iterator();
while(iterator.hasNext()) {
Object value = iterator.next();
}
Set<K> keySet() //返回值是个只存放key值的Set集合(集合中无序存放的)
Set<Map.Entry<K,V>> entrySet() //返回映射所包含的映射关系的Set集合(一个关系就是一个键-值对),就是把(key-value)作为一个整体一对一对地存放到Set集合当中的。
一. keySet()方式。
Map<String,String> map = new HashMap<String,String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
Set<String> keySet = map.keySet();//先获取map集合的所有键的Set集合
Iterator<String> it = keySet.iterator();//有了Set集合,就可以获取其迭代器。
while(it.hasNext()){
String key = it.next();
String value = map.get(key);//有了键可以通过map集合的get方法获取其对应的值。
System.out.println("key: "+key+"-->value: "+value);//获得key和value值
}
二. entrySet()方式:
Map<String,String> map = new HashMap<String,String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
//通过entrySet()方法将map集合中的映射关系取出(这个关系就是Map.Entry类型)
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//将关系集合entrySet进行迭代,存放到迭代器中
Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();
while(it2.hasNext()){
Map.Entry<String, String> me = it2.next();//获取Map.Entry关系对象me
String key2 = me.getKey();//通过关系对象获取key
String value2 = me.getValue();//通过关系对象获取value
System.out.println("key: "+key2+"-->value: "+value2);
}
虽然使用keyset及entryset来进行遍历能取得相同的结果
但两者的遍历速度是有差别的
keySet():迭代后只能通过get()取key
entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口
说明:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍历Map的性能不如entrySet性能好
为了提高性能,以后多考虑用entrySet()方式来进行遍历。
至于Map的三个易混淆:
HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
3. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现. (应用场景:购物车等需要顺序的)
代码实例:
[java] view plain copy print ?
- package com.alibaba.sample.petstore.web.store.module.screen;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.TreeMap;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.beans.factory.annotation.Autowired;
- public class ViewCart {
- @Autowired
- private HttpServletResponse response;
- public void execute() throws Exception {
- this.useHashMap();
- this.useTreeMap();
- this.useLikedHashMap();
- }
- public void useHashMap() throws Exception {
- response.getWriter().println("------无序(随机输出)------");
- Map<String, String> map = new HashMap<String, String>();
- map.put("1", "Level 1");
- map.put("2", "Level 2");
- map.put("3", "Level 3");
- map.put("a", "Level a");
- map.put("b", "Level b");
- map.put("c", "Level c");
- Iterator<Entry<String, String>> it = map.entrySet().iterator();
- while (it.hasNext()) {
- Entry<String, String> e = it.next();
- response.getWriter().println("Key: " + e.getKey() + "; Value: " + e.getValue());
- }
- }
- // 有序(默认排序,不能指定)
- public void useTreeMap() throws Exception {
- response.getWriter().println("------有序(但是按默认顺充,不能指定)------");
- Map<String, String> map = new TreeMap<String, String>();
- map.put("1", "Level 1");
- map.put("2", "Level 2");
- map.put("3", "Level 3");
- map.put("a", "Level a");
- map.put("b", "Level b");
- map.put("c", "Level c");
- Iterator<Entry<String, String>> it = map.entrySet().iterator();
- while (it.hasNext()) {
- Entry<String, String> e = it.next();
- response.getWriter().println("Key: " + e.getKey() + "; Value: " + e.getValue());
- }
- }
- public void useLikedHashMap() throws Exception {
- response.getWriter().println("------有序(根据输入的顺序输出)------");
- Map<String, String> map = new LinkedHashMap<String, String>();
- map.put("1", "Level 1");
- map.put("2", "Level 2");
- map.put("3", "Level 3");
- map.put("a", "Level a");
- map.put("b", "Level b");
- map.put("c", "Level c");
- Iterator<Entry<String, String>> it = map.entrySet().iterator();
- while (it.hasNext()) {
- Entry<String, String> e = it.next();
- response.getWriter().println("Key: " + e.getKey() + "; Value: " + e.getValue());
- }
- }
- }
返回结果:
[html] view plain copy print ?
- ------无序(随机输出)------
- Key: 3; Value: Level 3
- Key: 2; Value: Level 2
- Key: 1; Value: Level 1
- Key: b; Value: Level b
- Key: c; Value: Level c
- Key: a; Value: Level a
- ------有序(但是按默认顺充,不能指定)------
- Key: 1; Value: Level 1
- Key: 2; Value: Level 2
- Key: 3; Value: Level 3
- Key: a; Value: Level a
- Key: b; Value: Level b
- Key: c; Value: Level c
- ------有序(根据输入的顺序输出)------
- Key: 1; Value: Level 1
- Key: 2; Value: Level 2
- Key: 3; Value: Level 3
- Key: a; Value: Level a
- Key: b; Value: Level b
- Key: c; Value: Level c