Map对象中的KeySet()与EntrySet()的区别
Map集合提供了get()方法获取元素,但是get()对应的是一个键取出值,这种方式比较局限和单一,不能一次性全部取出来。要取出所有的值,就必须要取出所有的键,然后才能获取全部与键所对应的值。这时候get()方法就不能满足我们的需求了,但是Java为我们提供了相应的解决方式。
Map集合为我们提供了两种取值方式:
- 返回值类型:Set< Object > 方法是 keySet();返回此映射中包含键的Set视图,将Map中所有的键存入到Set集合中,因为Set具备迭代器,所以用迭代的方式取出所有键,再根据get()方法取出所对应的值。
- 返回值类型:Set<Map.Entry<K,V>> 方法是 entrySet(),这个方法取出的是关系,关系中包含key和value,其中 Map.Entry<K,V> 来表示数据类型。即:将Map集合中的映射关系存入Set集合中这个关系的数据类型 Map.Entry
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry。它表示Map中的一个实体(一个key-value对)。接口中getKey(),getValue方法。
效率比较:对于keySet()其实是遍历了2次,一次是转为iterator,一次就从Hashmap中取出Key所对应的Value。而entrySet()只是遍历了第一次,他把Key和Value都放到了Entry中,所以就快了。
keySet()取值演示图解:
keySet()取值方式:
public static void main(String[] args) {
//创建一个Map集合
Map<String,String> m=new HashMap<String,String>();
//向Map中添加数据
m.put("大象","Elephant");
m.put("猴子","Monkey");
m.put("熊猫","Panda");
//m.keySet()获取所有键的Set集合
// m.keySet().iterator()获取迭代器
Iterator<String> i =m.keySet().iterator();
while(i.hasNext()){
//获取key
String key = i.next();
//根据key获取value
String value=m.get(key);
System.out.println("key:"+key+"--->value:"+value);
}
}
输出结果为:
entrySet()取值演示图解:
entrySet()取值方式:
public class Test2 {
public static void main(String[] args) {
//创建一个Map集合
Map<String,String> m=new HashMap<>();
//向Map中添加数据
m.put("大象","Elephant");
m.put("猴子","Monkey");
m.put("熊猫","Panda");
/*将Map中的键和值取出来,
再调用Map的EntrySet()方法,最后调用迭代器*/
Iterator<Map.Entry<String,String>> i=
m.entrySet().iterator();
while(i.hasNext()){
Map.Entry<String, String> next = i.next();
/*因为Map.Entry<K,V>接口为我们提供了
getKey()和getValue()方法,我们可以用
这两个方法获取相应的键和值*/
String key = next.getKey();
String value = next.getValue();
System.out.println("key:"+key+"--->value:"+value);
}
}
}
输出结果为:
总结:
在API文档中有 public static interface Map.Entry<K,V> 其中被static静态修饰,只有接口在成员位置上才能加静态修饰符 ,说明其是内部接口。
keySet():
先获取所有键的集合, 再根据键获取对应的值。(即先找到丈夫,去找妻子)
entrySet():
先获取map中的键值关系封装成一个个的entry对象, 存储到一个Set集合中,再迭代这个Set集合, 根据Entry获取对应的Key和Value向集合中存储自定义对象 。(Entry类似于是结婚证)