哈希表概述

哈希表概述

哈希值

万物都有哈希值

方法hashCode()就是返回一个对象的哈希值;这个方法属于Object类,Object类是万物的父类,所以也就是万物都有哈希值;

hashCode()返回的是int类型的值;

哈希表结构

哈希表的结构是对象数组+链表+二叉树的形式;

对象数组长度为16,元素下标为0-15,每个元素称之为哈希桶,也就是有16个哈希桶;

每个哈希桶的结构是链表加二叉树的形式;

哈希表存取数据

假如有个Object对象要存入哈希表中:

刚开使用**Object.hashCode()**得到一个int值的数据,然后int值%16(除16取余数),得到的值为多少,就存入对象数组对应下标的哈希桶中,并放在链表第一个位置,当又一个对象进入该哈希桶,该对象就放在链表第二个位置,以此类推;

当一个哈希桶中存的对象大于8个时,链表就会自动变为二叉树的存储形式;

当哈希桶中对象个数减少到6个时,二叉树又会变成链表结构;

散列因子

初始时对象数组长度为16;但是当散列因子>=0.75时,对象数组长度会扩容两倍;

散列因子:就是目前存储了对象的哈希桶占目前所有哈希桶的比例,0.75就是指有75%的哈希桶存储了对象;

当扩容到两倍时:下一次就是除以32取余了(如果之前是除16取余)


HashMap存储数据:

HashMap存储的是键值(K V)的数据;

计算出K的哈希值,然后进行取余运算:(n-1) & hash:表示K的哈希值hash除以对象数组长度取余;

当该哈希桶没有数据,就创建一个新节点存入该键值对;

如果哈希桶已经有数据,就拿要存的数据的K和哈希桶里面的K一一比对,如果K一样,就用新的V覆盖旧V并返回旧V,如果K不一样则存存在最后的节点上;

HashMap存数据流程如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种基础的数据结构,它将关键字映射到哈中的一个位置,从而实现快速的查找、插入和删除操作。在设计哈时,需要进行需求分析,以确保哈能够满足用户的需求,并且能够高效地处理大量数据。 以下是哈设计需求分析说明书的内容: 1. 需求概述:在这一部分中,需要明确哈的功能和应用场景,以及用户的需求和期望。例如,哈的主要功能是快速查找、插入和删除数据,应用场景包括数据库、缓存、字典等,用户需要一个高效、可靠、易于使用的哈。 2. 功能需求:在这一部分中,需要明确哈的各项功能需求,包括数据插入、数据查找、数据删除、哈扩容、哈冲突解决等。对于每项功能需求,需要明确其输入、输出、处理逻辑、异常处理等详细内容。 3. 性能需求:在这一部分中,需要明确哈的性能需求,包括哈的插入、查找、删除操作的时间复杂度、空间占用、哈冲突率等。同时需要考虑哈的负载因子、哈函数的设计等因素,以确保哈具有良好的性能和可扩展性。 4. 用户界面需求:在这一部分中,需要明确用户与哈的交互界面,包括程序接口、命令行界面、图形界面等。需要考虑用户的使用习惯、易用性、可维护性等因素,以便用户能够方便地使用和管理哈。 5. 可靠性需求:在这一部分中,需要明确哈的可靠性需求,包括数据完整性、安全性、可恢复性等。需要考虑数据丢失、哈崩溃、哈冲突等异常情况,以确保哈能够保护用户数据的安全和完整性。 6. 维护性需求:在这一部分中,需要明确哈的维护性需求,包括代码可读性、可维护性、可扩展性等。需要考虑代码的模块化、注释、文档、测试等方面,以确保哈能够方便地进行维护和扩展。 7. 其他需求:在这一部分中,可以列出一些其他的需求,例如性价比、兼容性、可移植性等。这些需求可能不是必需的,但是对于一些特定的用户或场景来说,可能具有重要的意义。 通过以上的需求分析,可以明确哈的设计目标和要求,从而在实现过程中更加清晰和有针对性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值