一、什么是Map:

  首先map是一个集合,一种按照键存储元素的容器。在map中键可以是任意类型的对象,map中不能有重复的键,每一个键都有一个对应的值。

二、Map集合的特点:

  1、Map是一个双列集合,一个元素包含两个值,一个key和一个value

  2、Map集合中的元素,key和value的数据类型可以相同也可以不同

  3、Map中的元素,key不允许重复,但是value可以重复

  4、Map里面的key和value是一一对应的

三、Map常用的实现类

Map集合-LMLPHP

  HashMap:特点

  1、首先hashmap底层是哈希表,查询速度非常快。

  版本差异:JDK1.8之前是数组+单向链表,JDK1.8之后是数组+链表+红黑树,当单向链表长度超过8时,就转换成红黑树

  2、hashmap是无序的集合,存储元素和取出元素的顺序有可能不一致

  3、hashmap不是线程安全的,因为当key冲突的时候,就需要把多个value放在同一个位置,jdk1.7以前就是通过链表的方式挂在同一个位置上,jdk1.8以后就是通过平衡树的方式来代替链表的方式,当我们多个线程同时插入数据库的时候就会出现线程不安全,当我们插入一个value节点会进行判断是否为空,这时候多个线程都判断为空,那么后插入的数据就会在节点上面覆盖前插入的数据,并没有挂在后面。虽然不是线程安全的,但是速度快,效率高。

  HashMap常用方法:

  put(K key,V value):向集合中添加元素

  实现原理:当我们向集合中添加元素的时候,先根据key值调用hsahCode方法,得到hashCode值,再根据与运算得到map中数组的下标,然后判断这个位置是否为空,若为空,则添加,

  若不为空,则判断是链表还是红黑树,如果是链表,那么遍历链表判断链表长度是否大于8,大于8则转换成红黑树插入键值对,小于8则判断key值是否相同,若不同则插入,若相同则替换value,

  如果是红黑树,那么直接插入键值对。

 1 package collection;
 2
 3 import java.util.HashMap;
 4
 5 public class MapTest {
 6     public static void main(String[] args) {
 7         HashMap<String, Integer> map = new HashMap<>();
 8         map.put("张三",25);//向map中添加元素
 9     }
10 }

  注:由于HashMap中的key是唯一的,因此在使用put方法向集合中添加元素时,一般不能添加相同的key,否则会新添加元素的value值会覆盖原来的value值。

 1 package collection;
 2
 3
 4 import java.util.HashMap;
 5
 6 public class MapTest {
 7     public static void main(String[] args) {
 8         HashMap<String, Integer> map = new HashMap<>();
 9         map.put("张三",25);//向map中添加元素
10         System.out.println("原Value"+map.get("张三"));
11         map.put("张三",24);
12         System.out.println("新Value"+map.get("张三"));
13         System.out.println(map.size());
14     }
15 }

  输出结果:

Map集合-LMLPHP

   get(Object key):返回指定键所映射的值,如果没有key所对应的value,那么返回null

  size()返回map中元素的数量

  clear()清空map集合

  isEmpty()判断map集合中是否有数据,没有返回true,有返回false

  remove(Object key)删除map集合中键为key的数据,并返回其所对应的value值

  values()返回map集合中所有value组成的数据

  HashMap遍历方式:

 1 package collection;
 2
 3
 4 import java.util.HashMap;
 5 import java.util.Iterator;
 6 import java.util.Map;
 7 import java.util.Set;
 8
 9 public class MapTest {
10     public static void main(String[] args) {
11         Map<String, Integer> map = new HashMap<>();
12         map.put("张三",25);//向map中添加元素
13         map.put("李四",24);
14         //第一种遍历方式
15         Set<Map.Entry<String, Integer>> entries = map.entrySet();
16         for (Map.Entry<String, Integer> m: entries) {
17             System.out.println(m.getKey()+m.getValue());
18         }
19         //第二种遍历方式
20         Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
21         while (iterator.hasNext()){
22             System.out.println(iterator.next());
23         }
24     }
25 }

  由上图看出linkedHashMap继承自hashmap,那么很多操作都应该建立在hashmap的基础上,那么与hashmap具体有哪些不同呢?

  首先,linkedHashMap是哈希表+链表的一种结构。特点:LinkedHashMap是一个有序的集合,存储元素和取出元素的顺序一致

 1 package collection;
 2
 3 import java.util.HashMap;
 4 import java.util.Iterator;
 5 import java.util.LinkedHashMap;
 6 import java.util.Map;
 7
 8 public class Linked {
 9     public static void main(String[] args) {
10         Map<String, String> map = new LinkedHashMap<String,String>();
11         map.put("a3", "aa");
12         map.put("a2", "bb");
13         map.put("b1", "cc");
14         Iterator iterator = map.values().iterator();
15         while (iterator.hasNext()){
16             System.out.println(iterator.next());//aa bb cc
17         }
18     }
19     public static void main(String[] args) {
20         Map<String, String> map = new HashMap<String, String>();
21         map.put("a3", "aa");
22         map.put("a2", "bb");
23         map.put("b1", "cc");
24         for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
25             String name = (String) iterator.next();
26             System.out.println(name);//bb aa cc
27         }
28     }
29 }

  从以上代码结果可以看出,linkedHashMap在于存储数据如果你想保持存进去的顺序和拿出来的顺序一致,优先考虑linkedHashMap。

  那么不同之处:就是hashmap无序,而linkedHashMap有序。

  TreeMap:

  TreeMap存储的也是K-Value键值对,是通过红黑树实现,红黑树天然支持排序,默认情况下通过key值的自然排序进行排序

  TreeMap中的put方法为Map的核心方法,实现原理为:调用put方法,先判断红黑树是否已建,根节点是否为null,如果没有则创建红黑树赋值给root,接下来遍历红黑树节点,与传入的key值进行比较,然后判断是否有相同的key值,如果有相同的key,则替换value,如果没有则遍历到最后的节点作为插入节点的父节点,在父节点下插入字节点。

  总结:TreeMap中的元素是从小到大的顺序排列的。TreeMap是基于红黑树实现的,根据键key的自然顺序进行排序,也可以根据Comparator进行排序,具体取决于使用的构造方法。

package collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class Linked {
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String,String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
Iterator iterator = map.values().iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());//aa bb cc
}
}
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);//bb aa cc
}
}
}
06-30 15:46