1.Map集合的概述
- Map是一种键值对(key-value)的集合,Map集合中每一个元素都包含一个键对象和一个值对象,其中键Key对象不允许重复,而值Value对象可以重复。
- Map集合没有继承Collection接口,其提供的是key到value的映射,Map中不能包含相同的key值,每个key只能影射一个相同的value,key值还决定了存储对象在映射中的存储位置。
2.Map的子类
- Hashtable :底层是哈希表数据结构,不允许存入null键null值,该集合是线程同步的,效率低。jdk1.0
- HashMap :底层是哈希表数据结构,允许存入null键null值,该集合是线程不同步的,将hashtable替代,效率高。jdk1.2
- TreeMap : 底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序。
3.Map集合与Collection集合的区别
-
Map是双列的,即键值对,Collection是单列的
-
Map的键唯一,Collection的子体系set是唯一的
-
Map集合的数据结构值针对键有效,与值无关,Collection集合的数据结构针对元素有效
-
Collection集合的继承图
[外链图片转存失败(img-Zaw0bpL5-1562295440735)(media/15532714818029/15533063311200.jpg)] -
Map集合的继承图
[外链图片转存失败(img-mvAZ9gr2-1562295440737)(media/15532714818029/15533064081778.jpg)] -
Map存储元素使用put方法,Collection存储元素使用put方法
-
Map遍历没有直接取出元素的方法,而是先转成set集合,再通过迭代获取元素。
4.Map集合中常用的方法
- 添加功能
put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
- 删除功能
void clear():移除所有的键值对元素
remove(Object key):根据键删除键值对元素,并把值返回
- 判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
- 获取功能
Set<Map.Entry<K,V>> entrySet():
get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
- 长度功能
int size():返回集合中的键值对的个数
5. Map实例:
-
Map集合的遍历之键找值
HashMap<String, Integer> hm = new HashMap<>(); hm.put("张三", 23); hm.put("李四", 24); hm.put("王五", 25); hm.put("赵六", 26); /*Set<String> keySet = hm.keySet(); //获取集合中所有的键 Iterator<String> it = keySet.iterator(); //获取迭代器 while(it.hasNext()) { //判断单列集合中是否有元素 String key = it.next(); //获取集合中的每一个元素,其实就是双列集合中的键 Integer value = hm.get(key); //根据键获取值 System.out.println(key + "=" + value);//打印键值对 }*/ for(String key : hm.keySet()) { //增强for循环迭代双列集合第一种方式 System.out.println(key + "=" + hm.get(key)); }
-
Map集合的遍历之键值对对象找键和值
HashMap<String, Integer> hm = new HashMap<>(); hm.put("张三", 23); hm.put("李四", 24); hm.put("王五", 25); hm.put("赵六", 26); /* //获取所有的键值对象的集合 Set<Map.Entry<String, Integer>> entrySet=hm.entrySet(); Iterator<Entry<String, Integer>> it =entrySet.iterator();//获取迭代器 while(it.hasNext()) { Entry<String, Integer> en = it.next(); //获取键值对对象 String key = en.getKey(); //根据键值对对象获取键 Integer value = en.getValue(); //根据键值对对象获取值 System.out.println(key + "=" + value); } */ for(Entry<String,Integer> en : hm.entrySet()) { System.out.println(en.getKey() + "=" + en.getValue()); }
Hashtable
- key和value的值均不允许为null
- 它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
hashMap
- hashMap是一个最常用的Map集合,它根据键的HashCode值存储数据,根据键获取值,具有很快的访问速度,遍历时,获取的数据的顺序是随机的。
- HashMap只允许一条记录的键为null,而允许多条记录的值为null
- HashMap不支持线程同步(任意一个时刻有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
LinkedHashMap
- LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。
- LinkedHashMap在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
- 键(key)和值(value)均允许为null,线程不同步的。
HashMap和Hashtable的区别
- HashMap和Hashtable的区别
- Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
- Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
TreeMap
- TreeMap实现SortMap接口,能够把它保存的记录根据键排序。
- 默认是按照键(key)的升序排序,也可以指定排序的比较器,当用iterator遍历TreeMap时,得到的记录是排过序的。
- TreeMap不允许键(key)的值为null,线程不同步的。
1. TreeMap对集合中的键进行排序的方法
- 方式一:元素自身具备比较性
和TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。 - 方式二:容器具备比较性
当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重 写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。
注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;