Java学习之路(九):Map集合
Map集合概述和特点
Map是属于java.util的一个接口Map<k,v>
- k:映射所维护的键的类型
- v:映射值的类型
Map是将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map接口和Collection接口的不同
- Map是双列的,Collection是单列的
- Map的键唯一,Collection的Set是唯一的
- Map集合的数据结构只针对键有效,跟值无关
- Collection集合的数据结构是针对元素有效的
Map集合的功能概述
添加功能:
- V put(K key,V value):添加元素
- 如果键是第一次存储,直接存储元素,返回null
- 如果键不是第一次存储,就用本次存储的值将之前的值给替换掉,将以前的值给弹出
删除功能:
- void clear():移除所有的键值对元素
- V remove(Object key):根据键删除键值对元素,并把值返回
判断功能:
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
获取功能:
- V get(Object key):根据键获取值
- Set<K> KeySet():获取集合中所有键的集合
- Collection<V> values():获取集合中所有值的集合
长度功能:
- int size():返回集合中的键值对的个数
Map是一个接口,一般我们都是使用它的子类HashMap
HashMap使用注意事项
- 声明HashMap时的键值可以是任意对象
- 如果有重复的键,会把以前的替换
- 值可以为空(null)
- 键能为空
- put方法的返回值
- 如果键是第一次存值,就直接储存元素,返回null
- 如果键不是第一次存在,就用值把以前的值替换掉。返回以前的值
HashMap的一个简单的例子(第一种遍历方法:不推荐)
package lesson0006; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,String> map = new HashMap<>(); map.put("k1","v1"); map.put("k2","v2"); map.put("k3","v3"); map.put("k4","v4"); //获取所有的key Set<String> keys = map.keySet(); for(String k:keys){ String value = map.get(k); System.out.println("Key:"+k+"-Value:"+value); } } }
HashMap的另一个简单的例子(第二种遍历方法:推荐)-通过键值对对象(Entry)找键和值
package lesson0006; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class Demo02 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,String> map = new HashMap<>(); map.put("k1","v1"); map.put("k2","v2"); map.put("k3","v3"); map.put("k4","v4"); //获取所有的key Set<Entry<String, String>> entrySet = map.entrySet(); for(Entry entryObj:entrySet){ Object k = entryObj.getKey(); Object value = entryObj.getValue(); System.out.println("Key:"+k+"-Value:"+value); } } }
Entry的一些分析:
- Map.Entry是一个键值对对象
- Map.Entry是一个接口,它的实现类对象是HashMap$Node
- Map.Entry是有个key和value属性,通过get方法可以取值
- 我们遍历Entry的方法一般有迭代器和增强for循环
LinkedHashMap
特点:底层是链表实现的,所以可以保证怎么存就怎么取
HashMap和Hashtable的区别
- Hashtable是JDK1.0版本出现的,是线程安全的,所以也是效率低下的。
- HashMap是JDK1.2版本出现的,是线程不安全的,效率高
- Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
这里是补充的一点Collections工具类的概述和常见方法
Collections类的概述:是一个针对集合操作的工具类
Collections的成员方法:
- public static<T> void sort(List<T> list)
- public static<T> int binarySearch(List<?> list,T Key)
- public static<T> T max(Collection<?> coll)
- public static void reverse(List<?> list)
- public static void shuffle(List<?> list)
泛型补充:
? extends E(E的子类) 针对存的操作 ?表示子类,E表示父类
eg:ArrayList.addAll(Collection<? extends Father> c)
? super E(E的父类) 针对取的操作 ?表示父类,E表示子类
eg:ArrayList.sort(Comparator<? super Son> c)