No.5 Map集合
2016-04-10 本文已影响54人
醒着的码者
简介:
- Map集合:将键映射到值的对象。
(1)一个映射不能包含重复的键;
(2)每个键最多只能映射到一个值。 - Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。
- Map集合的数据结构只针对键有效,跟值无关 ,根据键的数据结构分类Map集合常用类为:HashMap,TreeMap
常用方法:
- 增加元素:V put(K key,V value):添加元素。
(1)如果键是第一次存储,就直接存储元素,返回null
(2)如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值 - 删除功能
(1)void clear():删除所有的键值对元素
(2)V remove(Object key):根据键删除键值对元素,并把值返回; - 查询:
(1)根据键来查询:boolean containsKey(Object key):判断集合是否包含指定的键
(2)根据值来查询;boolean containsValue(Object value):判断集合是否包含指定的值
(3)boolean isEmpty():判断集合是否为空 - 获取方法:
(1)V get(Object key):根据键获取值
(2)Set<K> keySet():获取集合中所有键的集合
(3)Collection<V> values():获取集合中所有值的集合
(4)Set<Map.Entry<K,V>> entrySet():遍历获取
关于Entry的理解;
相信大家在刚接触java的时候肯定对Map集合中Set<Map.Entry<K,V>> entrySet()方法很难理解,这里我说下我的理解,欢迎大家指正:
(1)首先我们理解什么是内部类,内部类简单来说就是定义在一个类中的类,内部类的特点是就是能够访问外部类的任何属性和方法;内部类的调用方法是"外部类.内部类";
(2)这里正是应用了这个方法:在Map接口内部定义了一个子接口,该字接口也可以理解为是Map类型的,这个子接口内部提供了获取Map集合中的key和value的方法;
(3)通过调用entrySet方法获取一个Set集合,该集合中存放的元素为Map.Entry类型的元素。
(4)API对这个内部接口定义大概意思是,他存储了与对应的Map集合相同的元素映射。也就是说同过entrySet方法得到的是将Map集合元素以Map.Entry类型存放在了一个set集合中。
(5)遍历Map.Entry我们只能通过高级for循环来遍历了。
Map集合的两种遍历方法;
public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
//遍历方式1:keySet
Set<Integer> key_Set = map.keySet();
for(Iterator<Integer> it = key_Set.iterator();it.hasNext();){
int key = it.next();
System.out.println("key :" + key +"; "+ "value : " + map.get(key));
}
//遍历方式2:entrySet
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for(Map.Entry<Integer, String> temp : entrySet){
System.out.println("key :" + temp.getKey() +"; "+ "value : " + temp.getValue());
}
}
}
注意Map集合没有迭代器方法,所以有了两个方法keySet()/entrySet();各返回一个Set集合,在通过遍历Set集合的方法来遍历Map中的内容;
方法1中:先通过将Map中的key存放在Set中,在遍历Set中的key的同时在调用Map的get方法获取值,这个方法略显得有点效率低下;
方法2中:先通过将Map中的Entry放在Set中,在通过遍历Set中的Map.Entry对象来获取Map中的键和值。这个方法是被推荐是使用的;但是这里有个误区千万不能在第二方法的时候同过迭代器来迭代Set集合!原因是获取it.next()值要不获取值要不获取键。如果一个循环内调用两次next获取键和值,那么就会产生错误;