Map

HashMap

以Entry[]数组实现的哈希桶数组,用Key的哈希值取模桶数组的大小可得到数组下标。

插入元素时,如果两条Key落在同一个桶(比如哈希值1和17取模16后都属于第一个哈希桶),Entry用一个next属性实现多个Entry以单向链表存放,后入桶的Entry将next指向桶当前的Entry。

查找哈希值为17的key时,先定位到第一个哈希桶,然后以链表遍历桶里所有元素,逐个比较其key值。

当Entry数量达到桶数量的75%时(很多文章说使用的桶数量达到了75%,但看代码不是),会成倍扩容桶数组,并重新分配所有原来的Entry,所以这里也最好有个预估值。

取模用位运算(hash & (arrayLength-1))会比较快,所以数组的大小永远是2的N次方, 你随便给一个初始值比如17会转为32。默认第一次放入元素时的初始值是16。

iterator()时顺着哈希桶数组来遍历,看起来是个乱序。

在JDK8里,新增默认为8的閥值,当一个桶里的Entry超过閥值,就不以单向链表而以红黑树来存放以加快Key的查找速度。

LinkedHashMap

扩展HashMap增加双向链表的实现,号称是最占内存的数据结构。支持iterator()时按Entry的插入顺序来排序(但是更新不算, 如果设置accessOrder属性为true,则所有读写访问都算)。

实现上是在Entry上再增加属性before/after指针,插入时把自己加到Header Entry的前面去。如果所有读写访问都要排序,还要把前后Entry的before/after拼接起来以在链表中删除掉自己。

TreeMap

以红黑树实现,篇幅所限详见入门教程。支持iterator()时按Key值排序,可按实现了Comparable接口的Key的升序排序,或由传入的Comparator控制。可想象的,在树上插入/删除元素的代价一定比HashMap的大。

支持SortedMap接口,如firstKey(),lastKey()取得最大最小的key,或sub(fromKey, toKey), tailMap(fromKey)剪取Map的某一段。

ConcurrentHashMap

并发优化的HashMap,默认16把写锁(可以设置更多),有效分散了阻塞的概率,而且没有读锁。

数据结构为Segment[],Segment里面才是哈希桶数组,每个Segment一把锁。Key先算出它在哪个Segment里,再算出它在哪个哈希桶里。

支持ConcurrentMap接口,如putIfAbsent(key,value)与相反的replace(key,value)与以及实现CAS的replace(key, oldValue, newValue)。

没有读锁是因为put/remove动作是个原子动作(比如put是一个对数组元素/Entry 指针的赋值操作),读操作不会看到一个更新动作的中间状态。

ConcurrentSkipListMap

JDK6新增的并发优化的SortedMap,以SkipList实现。SkipList是红黑树的一种简化替代方案,是个流行的有序集合算法,篇幅所限见入门教程。Concurrent包选用它是因为它支持基于CAS的无锁算法,而红黑树则没有好的无锁算法。

很特殊的,它的size()不能随便调,会遍历来统计。

补充

关于null,HashMap和LinkedHashMap是随意的,TreeMap没有设置Comparator时key不能为 null;ConcurrentHashMap在JDK7里value不能为null(这是为什么呢?),JDK8里key与value都不能为 null;ConcurrentSkipListMap是所有JDK里key与value都不能为null。

内容导航

第 1 页:List 第 2 页:Map

第 3 页:Set

java 小抄_专门为Java初学者准备的Java小抄集合(2)相关推荐

  1. java最大质数_月光软件站 - 编程文档 - Java - 给一个数,返回比它小的最大质数...

    给一个数,返回比它小的最大质数 今天,有个朋友说他们Java老师布置了一道题,要求写一个java程序, 已知一个数,然后给出比这个数小的最大质数. 起初给他写了这个asp的程序,希望他自己动手做出ja ...

  2. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  3. java 3d游戏_不放一行代码分享一下java实现3D游戏逻辑

    这篇日记是对最近几周Java大作业写的一个3D打怪挖矿游戏进行记录和总结.另一个目的也是因为我发现身边很多朋友对3D游戏逻辑很有兴趣.所以写这篇日记可以介绍一下一个3D游戏是如何实现基础功能的.即使没 ...

  4. java hashmap用法_备战金九银十:Java核心技术面试题100+,助你搞定面试官

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  5. java酷跑_不敢相信,居然用Java写了个“天天酷跑”!

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...

  6. java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...

  7. java oom分析_作为测试你应该知道的JAVA OOM及定位分析

    上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...

  8. java gradle构建_在Gradle中为JPMS构建Java 6-8库

    java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...

  9. java转换为c#_将25k行C#转换为Java的经验教训

    java转换为c# 由于各种原因,我最近完成了一个将复杂的财务应用程序从C#转换为Java的项目. 港口的原因大部分是非技术性的,而是对相关企业的一项战略举措. 这是一次有趣的经历,我在此过程中吸取了 ...

  10. java方法重载_在Python中该如何实现Java的重写与重载

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...

最新文章

  1. pandas以前笔记
  2. linux 服务器安装字体
  3. regexpal 正则表达式实时调试工具
  4. 人脸识别(二)——训练分类器
  5. 实战SpringMVC+Mybatis搭建高性能安全站点
  6. arcgis计算地形起伏度
  7. Material Design控件使用学习 toolbar+drawerlayout+ Snackbar
  8. 13个您应该安装的WordPress插件
  9. 有时便去寻找思维以外的精神
  10. Android中如何设置RadioButton在文字的右边,图标在左边
  11. Spring.Net学习笔记(3)-创建对象
  12. Hero传奇引擎47个疑难问题解答
  13. 完全卸载vs2015
  14. 全球首个AI公园亮相北京海淀区
  15. 最实用的网上赚钱方法:这7个方法真的很实用哦!
  16. 立通信电杆——水泥杆
  17. ISP(图像信号处理)白平衡White Balance
  18. 开源机器学习之MATLAB代码--LSTM-SVRNN(五)
  19. 手机安装charles证书与雷电模拟器4.0安装charles证书流程
  20. 【高斯 GANSS 键盘】 GS87-D 设置指南

热门文章

  1. 第五章用户组和管理权限
  2. 安卓编程用什么软件_高等计算、编程计算、化学方程计算!推荐一款非常强大的安卓手机计算器安卓软件...
  3. python程序设计从基础到开发夏敏捷_《Python程序设计——从基础到开发》 夏敏捷 杨关 张慧档 张慎武 宋宝卫 【正版电子纸书阅读_PDF下载】- 书问...
  4. 技术员联盟 Ghost Xp Sp3 纯净版 v2.5
  5. 数码管驱动设计-ISE操作工具
  6. 创业需要MVP(Minimum Viable Product,即“最小化可行产品”)
  7. 如何修改java运行环境版本_安卓修改大师配置Java运行环境教程 教你快速使用
  8. 计算机学院学生划分哪些专业,计算机科学与工程学院2020年大类招生学生专业分流工作实施方案...
  9. sql查询字段重复的数据 并且修改数据某个字段
  10. 1.19 Cubemx_STM32F4 TIM(五)---- 总结