Map集合

博客 动态
0 186
羽尘
羽尘 2022-06-30 16:01:10
悬赏:0 积分 收藏

Map集合

一、什么是Map:

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

二、Map集合的特点:

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

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

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

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

三、Map常用的实现类

 

 

 

  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 }

  输出结果:

   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 cc17         }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 cc27         }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进行排序,具体取决于使用的构造方法。

  HashTable:

  HashTable是哈希表,又叫做散列表,是根据键值对直接访问的数据结构。

  说到数据结构,那么我们对两种数据结构非常熟悉,数组和链表,当然数组的特点是查询快,增删慢,而链表的特点是增删快,查询慢,那么把它两结合起来是不是不但增删快,查询也快呢。

  哈希表就是两者结合起来的产物。

  hashTable与HashMap的不同之处:

  1、基类不同,HashTable继承Dictionary类,hashMap继承AbstractMap类

  2、hashMap可以允许存在一个为null的key和任意个为null的value,但是hashTable中的key和value都不允许为null。

  3、hashmap不是线程安全的,hashtable是线程安全的,因为hashtable的方法是Synchronize修饰的,而HashMap不是。

posted @ 2022-06-30 15:44 ~淡~然~ 阅读(4) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员