Java的HashMap键值对存储结构解析

容器总体结构

Map存储键值对的数据结构是“数组+链表”的结构,结合了数组查询数据快和链表增删数据快的优点;用Entry[]存储键值对,Entry为类类型,类里面有四个属性:hash、K、V、next,分别存储哈希值、键对象、值对象、下一个Entry对象引用。

Entry底层源码

Entry对象存储结构图

Entry数组存储结构图

HashMap存储数据过程示意图

我们的目的是将”key-value两个对象”成对存放到HashMap的Entry[]数组中。参见以下步骤:

(1) 获得key对象的hashcode

首先调用key对象的hashcode()方法,获得hashcode。

(2) 根据hashcode计算出hash值(要求在[0, 数组长度-1]区间)

hashcode是一个整数,我们需要将它转化成[0, 数组长度-1]的范围。我们要求转化后的hash值尽量均匀地分布在[0,数组长度-1]这个区间,减少“hash冲突”

原文地址:https://www.cnblogs.com/chiweiming/p/11388095.html

时间: 2024-08-28 16:46:33

Java的HashMap键值对存储结构解析的相关文章

实现键值对存储(三):Kyoto Cabinet 和LevelDB的架构比较分析

译自  Emmanuel Goossaert (CodeCapsule.com) 在本文中,我将会逐组件地把Kyoto Cabinet 和 LevelDB的架构过一遍.目标和本系列第二部分讲的差不多,通过分析现有键值对存储的架构来思考我应该如何建立我自己键值对存储的架构.本文将包括: 1. 本架构分析的意图和方法 2. 键值对存储组件概览 3. Kyoto Cabinet 和LevelDB在结构和概念上的分析 3.1 用Doxygen建立代码地图 3.2 整体架构 3.3 接口 3.4 参数化

实现键值对存储(二)——以现有键值对存储为模型

本文是<实现键值对存储>系列译文的第二篇 原文来自Emmanuel Goossaert (CodeCapsule.com) 本文中,开头我会解释使用现有模型而非重头开始此项目的原因.我会阐述一系列选择键值对存储模型的标准.最后我将对一些广为人知的键值对存储项目做一个概述,并用这些标准选择其中一些作为模型.本文将包含: 1. 不重新发明轮子 2. 备选模型和选择标准 3. 选择的键值对存储的概述 4. 参考文献 1. 不重新发明轮子 键值对存储已经被人们唱好至少30年了[1].最著名的一个项目是

Android基础--键值对存储(SharedPreferences)

SharedPreferences用于将键值对形式的数据存储到当前应用专属的存储空间中 package com.itheima.sharedpreferences; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.text.T

Java数据结构-树及树的存储结构

树的定义:n(n>=0)个节点的有限集. n=0时称为空树. n!=0时为非空树,有且仅有一个特定的节点--根:n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 树的一些基本术语: 树的结点:由一个数据元素和若干个指向其子树的分支组成. 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度. 叶子结点:度为0的结点称为叶子结点,或者称为终端结点. 分支结点:度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结

iCloud键值数据存储

iCloud键值存储,以一种键值对的方式存储简单类型数据,这些数字类型包括数字,日期,数组和字典等类型.数据结构是以plist类型.每个应用只能存储64KB数据.它也没有像文档存储那样有一套数据冲突解决方案,新的数据会覆盖掉旧的数据.因此,它经常用来存储系统设置,使用偏好以及应用状态.

标准app基础模板建立-活动管理-定时服务-键值对存储-日志工具

一.建立工程 1.建立一个空白的工程,名称为ModelApp. 2.在main-java下新建package,起名com.jiaweiqiang.tools,用于放置通用工具类. 二.建立得到全局变量的Application类 1.在tools中新建MyApplication类,用于存储全局context和其他程序需要的通用变量. public class MyApplication extends Application { private static Context context; pr

键值形式的文件解析api-解析类ini形式的配置文件

glib-键值形式的文件解析api 解析类ini形式的配置文件   前言 本文转自https://developer.gnome.org/glib/unstable/glib-Key-value-file-parser.html 业余时间进行翻译,欢迎批评指正. 函数 GKeyFile * g_key_file_new () void g_key_file_free () GKeyFile * g_key_file_ref () void g_key_file_unref () void g_k

VSAN存储结构解析;存储数据恢复的成功案例分享

今天给大家介绍一的是一款常见存储设备-Vsan的结构原理,相对而言技术性文字较多.VSAN是一种以vSphere内核作为基础开发出来的一款可以扩展使用的分布式存储架构.这款存储在vSphere集群主机中安硬盘及闪存构建出VSAN存储层,通过存储进行管理与控制,最终形成一个共享存储层.伴随着计算机网络的快速发展,vsan的存储结构也在不断的更新换代过程中,传统的存储管理机制中的底层存储不了解虚拟化和文件系统,新一代的存储管理机制将更新为基于对象存储系统.虚拟数据存储.分布式存储.下图为vsan的存

java 请求参数键值对重复问题

java在通过url访问接口的过程中,url需传入参数,可将请求参数作为键.请求参数获取的值作为值.在传参过程中,若键出现重复,则会出现覆盖现象,值可出现重复现象. 如以下案例: 案例1: controller层: @RestController@RequestMapping("api")public class MemberController { @RequestMapping(value = "v2/member/member/resources/update"