1、Hash

也叫散列、哈希。

主要用于信息安全领域中的算法,把长度不同的信息转化为杂乱的128位的编码,找到一种数据内容与地址之间的映射关系。

注意:不同的输入可能会散列成相同的输出

我们最熟悉的Object类中就提供了hashcode的方法。

public native int hashCode();

2、数据结构

Java集合的实现底层大都是基本数据结构的又一层封装。

数组:寻址容易,插入和删除困难

链表正好相反。

HashMap正好将二者互补了一下,推出了链表+数组的组合方式,也叫链表散列、“拉链法”。

结构示意图:

放入元素时,根据key值通过hashcode找到对应数组的位置,放入横向数组的某个格子中。因为前面说到hashcode值不能保证唯一,如果之后hashcode值对应的数组位置中已经有值,就放到相连的链表中。

查找元素也是按这个过程来进行。

代码实现:

注意:每个Node中都持有下一个节点的引用。 

3、算法优化

由上面的数据结构介绍,可以看出,在查找的时候,尽量避免查找链表能够大大提高存取效率。

目标:元素尽可能均匀分布,这样查找的时候不必查找链表,效率很高。

思路一:

取模运算,实现是可以实现,但取模运算消耗大、效率不高。

思路二:

首先,&运算比取模运算效率高。 
hashmap采用的是下面这种与运算。

大同小异,都是为了减少碰撞,避免hash到同一个位置,使元素分布更均匀。在实现的基础上,考虑性能问题。

最新文章

  1. webapi集成owin使用Oauth认证时能获取accee_token仍无法登录的解决办法
  2. Java的泛型反射
  3. 强大的矩阵奇异值分解(SVD)及其应用
  4. 关于angularJS绑定数据时自动转义html标签
  5. UDP模式聊天
  6. PhpCMS标签:专题模块special标签
  7. js在本地预览图片
  8. iis配置出现的问题及解决
  9. 用sqlyog迁移mysql数据库
  10. 网络数据传输安全及SSH与HTTPS工作原理
  11. Aspnet Mvc 前后端分离项目手记(二)关于token认证
  12. Linux基础学习笔记5-软件管理
  13. Swift Write to file 到电脑桌面
  14. redis实现队列
  15. idea2017授权
  16. extern声明全局变量用法
  17. 3DES加密解密
  18. 不用 Twitter Bootstrap 的5个理由
  19. Java第三阶段学习(三、字符流、转换流)
  20. Python实现常见算法[1]——冒泡排序

热门文章

  1. spring boot thymeleaf 标签未关闭报错
  2. Kmeans基本思想
  3. JVM实践
  4. 201904Online Human Action Recognition Based on Incremental Learning of Weighted Covariance Descriptors
  5. TCP/IP与OSI模型
  6. TCP/IP协议---广播和多播及IGMP协议
  7. 解析LED发光效率
  8. Luogu2469 SDOI2010 星际竞速 费用流
  9. Java并发——线程中断学习
  10. A2dp初始化流程源码分析