最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 服务器 > 系统运维 >
认识map和map的遍历方式
CSDN发表于 2020-09-15 16:50 次浏览

这篇文章主要介绍了关于map的知识还有map遍历的四种方式的代码实现,需要的朋友可以参考下:

1、map集合概述

public interface Map<K,V>

首先看一下map接口,我们可以看到map的存值结构以键值对结构,简单来说,map集合就是一个将键(key)映射到值(value)的对象.且一个映射不可以包含重复的键,;每个键只能映射到一个值.

2、map的存储结构

如上图所示,map中存储数据的方式是一个key对应一个value值,key值可为null,但由于key的值不可重复,故key为null的情况也只可以有一次,value的值不做要求,可以重复也可以多个为null,一对键值对底层是放在一个entry数组中的。

查询的时候是根据键(key)键的值的hashcode值找寻value所对应的位置,如果对同一个键多次赋value的值,那么后赋的值会覆盖前面赋的值.

3、总结一下map的一些特点

  1. Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。

  •  
    1. Map集合中的元素,key和value的数据类型可以相同,也可以不同。

  •  
    1. Map集合中的元素,key是不允许重复的, value是可以重复的。

  •  
    1. Map集合中的元素,key和 value是一一对应的。

    4、map的实现类


    下面挑几个比较常用的实现类来讲解吧

    4.1 HashMap

    这是我们日常使用比较多的一个实现类. 它的底层实现方式是数组+链表,key和value的值都可以为null. 初始的内存大小为16,一般存储元素到达大小的一半的时候进行扩容. 线程不安全,但优点在于效率比较高. HashMap不支持同步,即同一时刻多个线程同时进行写操作是可能会导致数据的不一致,若需要支持同步的话,可以使用collections的synchronizedmap方法.

    4.2 Hashtable

    它的底层实现是数组+链表,key和value不可以存储null. 因为给大多数的操作都加了锁的缘故,所以Hashtable支持同步操作,但也正是这一点,导致了Hashtable的写入速度较慢,在对于数据的安全级别要求较高的时候使用.

    4.3 ConcurrentHashMap

    它的底层实现是分段数组+链表. Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍.

    4.4 linkedHashMap

    LinkedHashMap可以认为是HashMap和LinkedList合体,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序. 内部维持了一个双向链表. LinkedHashMap是HashMap的子类. 它的元素按照插入顺序排列. 遍历速度较慢.

    4.5 TreeMap

    基于红黑树(Red-Black tree)的 NavigableMap 实现.该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序.具体取决于使用的构造方法。优点是键值可排序,唯一,值有序可重复,底层数据结构是平衡二叉树.

    5、map接口中的常用方法

    1. public V put(K key, V value):把指定的键与指定的值添加到Map集合中.

    2. public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除返回被删除元素的值.

    3. public V get(Object key):根据指定的键,在Map集合中获取对应的值.

    4. boolean containsKey(Object key):判断集合中是否包含指定的键.

    5. public SetkeySet():获取Map集合中所有的键,存储到Set集合中.

    6. public SetkeySet():获取Map集合中所有的键,存储到Set集合中.

    6、map遍历

    下面将一些map集合遍历的几种方式

    6.1 使用 Entry 实现

    在for循环中使用 Entry 实现 Map 的遍历

    
    
    1.  
          Map<String,String> map = new HashMap<>();
    2.  
          map.put("大白", "白色");
    3.  
          map.put("柯基", "黄色");
    4.  
          for(Map.Entry<String, String> entry : map.entrySet()){
    5.  
              String mapKey = entry.getKey();
    6.  
              String mapValue = entry.getValue();
    7.  
              System.out.println(mapKey+":"+mapValue);
    8.  
          }

    运行结果:

    6.2 通过 Entry 获取 key 或者 values

    在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好

    
    
    1.  
          Map<String,String> map = new HashMap<>();
    2.  
          map.put("大白", "白色");
    3.  
          map.put("柯基", "黄色");
    4.  
          //key
    5.  
          for(String key : map.keySet()){
    6.  
              System.out.println(key);
    7.  
          }
    8.  
          //value
    9.  
          for(String value : map.values()){
    10.  
              System.out.println(value);
    11.  
          }

    运行结果:

    6.3 通过 Iterator 遍历

    
    
    1.  
      Map<String,String> map = new HashMap<>();
    2.  
              map.put("大白", "白色");
    3.  
              map.put("柯基", "黄色");
    4.  
              Iterator<Entry<String, String>> entries = map.entrySet().iterator();
    5.  
              while(entries.hasNext()){
    6.  
                  Entry<String, String> entry = entries.next();
    7.  
                  String key = entry.getKey();
    8.  
                  String value = entry.getValue();
    9.  
                  System.out.println(key+":"+value);
    10.  
              }

    运行结果:

    6.4 通过键找值遍历

    通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作。

    
    
    1.  
      Map<String,String> map = new HashMap<>();
    2.  
              map.put("大白", "白色");
    3.  
              map.put("柯基", "黄色");
    4.  
              for(String key : map.keySet()){
    5.  
                  String value = map.get(key);
    6.  
                  System.out.println(key+":"+value);
    7.  
              }

    运行结果:

    小结

    好了,以上就是我自己总结的一些关于map的知识还有map遍历的四种方式的代码实现.有不对或者不足的地方欢迎大家指点,共同学习共同进步,谢谢!

标签:map什么意思
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐