HashMap内部算法

HashMap用数组存放数据,初始长度16
一、存放数据的过程:
1◆先获得键的哈希值key.hashCode()
2◆用哈希值来计算一个下标值index
3◆将键和值,封装成一个Entry对象
4◆Entry对象,放入index位置
空位置,直接放入
有数据,依次用equals()比较剪是否相等
找到相等的,覆盖值
没有相等的,链表连在一起
5◆负载率(数据数量/数组数量)、加载因子到0.75
新建容量翻倍的新数组
所有数据,重新哈希,放入新数组
◆jdk1.8
链表长度到8,转成红黑树
红黑数数量减少到6,转回成链表


内部算法

二、hashCode()
从Object继承的方法
Object中默认实现是用内存地址值,作为哈希值
可以在子类中重写这个方法,用对象属性的数据,来计算哈希值

public native int hashCode();

使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。这些函数的实现体在DLL中,JDK的源代码中并不包含,是看不到源码的。对于不同的平台它们也是不同的。java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。
*)相同属性,必须计算出相同哈希值
*)不同属性,必须计算出不同哈希值

 @Override

       public int hashCode() {

          int prime = 31;

          int result = 1;

          result = result*prime + id;

          result = result*prime + name.hashCode();

          return result;

       }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,291评论 0 16
  • 齁精神的“悠然”突然想说说“晒”这个字!亲们可别对号入座。只是发表与记录自己对“晒”字的理解!这其中“悠然”也在其...
    静默如谜l阅读 255评论 0 2
  • 立春后的风,收起了犀利的手掌,一阵阵吹过,竟然不觉得冷,站在十点一刻的长廊上,我吸着一支纸烟,目光被楼下屋顶上的落...
    云中飘舞阅读 314评论 4 17
  • 2016年7月16日,背上行囊一个人独自踏上前往印度尼西亚AIESEC国际志愿者的道路。报名参加印尼“BRING ...
    441fc1fed9c5阅读 181评论 0 1