Map集合总览

  1. 保存映射关系key-value键值对,键唯一,值可以重复,Map和Set的实现类相似

  2. Entry是Map的内部类

  3. Map接口中常用的方法:

    • void clear()
    • Set keySet(),返回Map中key组成的Set集合
    • Object put(Object key, Object value)
    • Map内部类Entry的方法
      • Object getKey()
      • Object getValue()
  4. Map遍历

    public void map() {
    Map<Integer, String> books = new HashMap<>();
    books.put(1, "first");
    books.put(2, "second");
    // 1.使用foreach
    for (Object key : books.keySet()) {
    System.out.println(key + "->" + books.get(key));
    }
    // 2.使用迭代器
    for(Iterator<Map.Entry<Integer, String>> it = books.entrySet().iterator();it.hasNext();) {
    System.out.println(Key + "->" + it.next().getKey());
    }
    }

HashMap

  1. 核心要点如下:

    • 无序,线程不安全,集合元素可以为null
    • 底层是散列表(数组+链表)和红黑树
    • 散列表中的装载因子属性默认是0.75,当装载因子*初始容量小于需要散列容量时,散列表会再散列,扩容两倍
    • 初始容量默认是16
    • put方法存储时,不是直接使用key的hash值,而是将key的hash值与其高16位进行异或操作,使得在做&运算时的低位其实为高位和低位的结合,增加随机性。防止碰撞冲突
    • 当桶上有8位元素并且散列表容量大于64时链表数组变成红黑树
  2. HashMap与Hashtable比较:
    • 相同

      • 存储结构基本相同,都是实现Map接口
    • 区别
      • HashMap不是线程同步的,Hashtable是线程同步的
      • HashMap允许值为null,Hashtable不允许为null
      • Hashtable有contains方法,HashMap将contains方法改成了containsValue和containsKey
      • HashMap继承AbstractMap,Hashtable继承Dictionary

LinkedHashMap

  1. 核心要点如下:

    • LinkedHashMap比HashMap多了一个双向链表的维护,初始容量对其遍历是不影响的
    • LinkedHashMap调用父类HashMap的put方法,重写了put方法内部的newNode方法
    • 默认使用插入顺序(insertion-ordered)遍历,也可以通过重写方法设置为访问顺序(access-ordered)
    • 访问顺序开启的情况下,get方法和put方法中调用的afterNodeAccess方法会生效,执行将被访问的Entry移到尾部
  2. 对LinkedHashMap进行扩展实现LRUCache

TreeMap

  1. 核心要点如下:

    • 有序,线程不安全,key不能为null
    • 底层是红黑树,时间复杂度保证在O(logN)
    • 默认自然排序,自定义需在构造方法中传入Comparator对象

ConcurrentHashMap

  1. 核心要点如下:

    • Java8中,其底层结构是散列表和红黑树,同HashMap
    • 键、值都不能为null
    • 支持高并发的检索与更新,线程安全
    • get方法是非阻塞的,不需要加锁。因其重写了Node类,通过volatile关键字修饰值V及其对象使得每次获取最新的值
  2. 与Hashtable比较:
    • Hashtable在每个方法上都加上Synchronized以完成同步,效率低下
    • ConcurrentHashMap通过在部分加锁和利用CAS算法来实现同步

面试题一览

文章地址:https://www.cnblogs.com/chenpt/p/9824548.html

集合03_Map的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...

  3. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  4. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  5. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  6. Java基础Collection集合

    1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:

  7. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  8. Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...

  9. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

随机推荐

  1. IFrame session(转)

    问题场景: 在一个应用(集团门户)的某个page中, 通过IFrame的方式嵌入另一个应用(集团实时监管系统)的某个页面. 当两个应用的domain 不一样时, 在被嵌入的页面中Session失效.( ...

  2. 使用淘宝npm镜像

    我们都知道淘宝大量采用了Nodej技术,所以它的镜像还是值得肯定的!更多相关可查看:淘宝NPM镜像 npm的官方镜像在国内访问是比较慢的,所以替代方法是使用淘宝npm镜像! 淘宝 NPM 镜像是一个完 ...

  3. devstack 部署 openstack(pick/mitaka)

    链接出处: https://blog.csdn.net/qiqishuang/article/details/51990662 报错处理出处:https://blog.csdn.net/wang114 ...

  4. linux常用命令:cp 命令

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  5. div居中与div内容居中,不一样

    1.div自身居中 使用margin:0 auto上下为0,左右自适应的css样式. 要让div水平居中,那么除了设置css margin:0 auto外,还不能再设置float,不然将会导致div靠 ...

  6. GUI带有右键菜单,带有时间显示的

    %带有右键菜单的GUI figure('Menubar','none'); h = uicontextmenu; uimenu(h,'Label','A'); uimenu(h,'Label','B' ...

  7. php中生成标准uuid(guid)的方法

    );// "}"        return $uuid;    }}echo guid();?>

  8. Icarscan VCI is definitely the update variation of Start iDiag

    Start iCarScan is alternative of Super X431 iDiag, it’ll make your Android smartphone or tablet righ ...

  9. How to diagnose vehicle fault code by BMW ICOM and ISTA-D software

    Today illustrate how to diagnose vehicle fault code by BMW diagnostic tool BMW ICOM and ISTA-D softw ...

  10. 在Linux 中如何从进程相关的文件描述中恢复数据

    在Linux中误删除了某个文件,但是 ps-ef|grep 文件名 发现某个进程还在使用该文件,那么可以通 过以下方式恢复文件. 例如:创建一个简单文件/tmp/test.txt, 随便向里面写点内容 ...