数组和链表都是存储一个对象,HashMap 存储数据是以 一对数据来存储,即键值对【key(对象)---->value(对象)】。

JDK1.8版本之前,HashMap的实现: 数组 + 链表;

JDK1.8版本之后,HashMap的实现: 数组 + 链表 / 二叉树(红黒树);

数组的默认大小是16,加载因子【DEFAULT_LOAD_FACTOR】默认值是0.75f,表示当数组容量达到75%,数组会被重新扩充。数组的最大容量是整数最大值的一半。

HashMap存储数据结构中链表与二叉树的转化条件:  是键值对的总数大于64,且

a.在扩容时,当哈希表中数组同一个位置的链表长度大于8时(阀值),那么会把链表转换成红黑树,来提高查询效率;

b.在扩容时,当哈希表中数组同一个位置的链表长度小于6时(阀值),那么会把红黑树转换成链表,来提高查询效率。

阀值为什么是8 和 6? (防抖)减少链表与二叉树之间的转换频率,避免影响性能。

哈希表:这个是因为存储数据的方式被称为哈希(算法),Object类中hashCode方法是一个本地方法:表示此方法的具体实现是由 C、C++来实现的,哈希值()。

同一个对象,我们要保证在运行期hashCode值是相同的,如果不同那么此对象在哈希表中会有内存泄露问题。

内存泄露:由于对象在运行过程中,hashCode不同,导致该对象在哈希表中无法找到。

哈希表存储数据的算法:通过计算key对象的hashCode值,来确认key对象在哈希表数组中的存储位置,目的是为了可以通过计算hash值快速的查找对象。同一个对象,hashCode值相同,不同的对象,hashCode可能相同,因为整数是有限的。

使用hashCode计算对象的hash值:return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)。

怎么扩容?初始化大小?

a.在第一次put数据的时候初始化;

b.在put方法中实现,扩容算法是 oldCap << 1  表示乘于2;

c.每次扩容哈希表,会导致所有已存储的对象重新计算哈希值,存储到新的哈希表中(重新散列)。所以在hashMap中,对象所在的位置不保证永远不变(无序),重新散列会导致重新计算所有对象,消耗性能,在可预知的情况下,散列次数越少越好。

HashMap的优点与缺点?

优点:取值快,数据量越大越明显;

缺点:线程不安全,避免频繁散列(rehash)。合理的使用new HashMap<>(initialCapacity);初始容量,来减少散列。

java拥有键值对的数据结构_Java数据结构之004--HashMap相关推荐

  1. Java心得--键值、枚举器

    1. 集(Set):和数学上的"集合"概念相对应,是最简单的一种集合. Set集合中不区分元素的顺序,因此也就不记录元素的加入顺序. Set集合中不包含重复元素,即任意的两个元素e ...

  2. java用来存储键值的容器是_Java容器 - osc_y0caef0i的个人空间 - OSCHINA - 中文开源技术交流社区...

    问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.9容器 1.Java Collections框架是什么? Java Collections框架中包含了大量集合接 ...

  3. java的map键值类型是否固定_Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  4. java list键值_java基础之对List,Map,Set等集合键值对的简单认识

    [一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...

  5. java存储键值结构_java-键值存储为主数据库

    我将要开始一个项目,该项目的读写操作非常频繁且频繁.因此,环顾四周,我发现内存数据库正是为此目的而创建的.经过更多调查后,我进入了redis. Redis看起来很酷(虽然刚开始阅读,但是对此有很多了解 ...

  6. java hashtable 数据结构_java数据结构——哈希表(HashTable)

    哈希表提供了快速的插入操作和查找操作,每一个元素是一个key-value对,其基于数组来实现. 一.Java中HashMap与Hashtable的区别: HashMap可以接受null键值和值,而Ha ...

  7. Java Map 键值对排序 按key排序和按Value排序

    一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...

  8. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  9. java vk键值_Windows Mobile 手机编程常用键值(VK)对应表

    类型:PPC|WM平台大小:322KB语言:中文 评分:6.6 标签: 立即下载 Windows Mobile 常用键值(VK)对应表 #define VK_TSOFT1 VK_F1 // Softk ...

最新文章

  1. 关于PIC和FPGA
  2. We will be discontinuing the Nitrous Development Platform and Cloud IDE on November 14th, 2016.
  3. ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布
  4. 【数据结构与算法】字符串匹配 AC自动机
  5. 【Java】RuleSource约束常用方法整理
  6. 基于React的贪吃蛇游戏的设计与实现
  7. flask blueprint
  8. 8选1的多路选择器c语言代码,八选一数据选择器的VHDL程序
  9. 关于《高油压调速器机械液压系统的优化设计》的疑问
  10. 转录组分析_20个必须知道的转录组知识点!
  11. 混沌图像---陈氏吸引子的飞蛾
  12. Cadence中的homogeneous与hetergeneous的区别及注意事项
  13. linux网络本地发送lo性能,LINUX网络性能之管理工具三剑客
  14. mybatis-plus,sgg,杨bochao
  15. Unexpected error while running MyBatis Generator. Cannot resolve classpath entry: mysql-connector-ja
  16. 微信小程序项目源码springboot在线考试系统小程序+后台管理系统|前后分离VUE.js
  17. Buildroot 扩展文件系统大小
  18. 嵌入式系统 操作系统 uC/OS uClinux
  19. Arduino Uno 实验4——电位器
  20. 17小学计算机课程目录,课程

热门文章

  1. 系统的性能瓶颈,排查该从哪些方面入手,如何定位?
  2. linux canopen软件,CANopen学习笔记
  3. oracle明文传输http,oracle密码在网络传输中的安全问题
  4. Docker用Portainer将Solr集群添加入Repository
  5. Docker Kubernetes 环境搭建
  6. Java基础-HashMap集合
  7. leetcode题解976-三角形的最大周长
  8. Linux 打包和压缩
  9. Android学习笔记——ProgressBarHandler
  10. 修改uid gid 的起始范围