博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashSet HashMap 源码阅读笔记
阅读量:5752 次
发布时间:2019-06-18

本文共 1536 字,大约阅读时间需要 5 分钟。

hashcode() 与 equals() 应一起重写,在HashMap 会先调用hash(key.hashcode()) 找到对应的entry数组位置 (一般初始是16,2^x,rehash后会翻倍),再在这个entry链表上equals判断是否存在相同元素。

所以当重写equals时没保证hashcode出的值的一致性,会导致hash到不同的数组位置 插入重复的元素。

※String类的hashcode是通过各个位置的char的ascii码计算Σx*31^(len-i)得到的※

HashSet通过HashMap实现,其中每次插入的value值都是一个Object的常量。iterator()返回map的hashmap的keyiterator。

HashMap成员变量

1 //默认初始化map的容量:16 2 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 3 //map的最大容量:2^30 4 static final int MAXIMUM_CAPACITY = 1 << 30; 5 //默认的填充因子:0.75,能较好的平衡时间与空间的消耗 6 static final float DEFAULT_LOAD_FACTOR = 0.75f; 7 //将链表(桶)转化成红黑树的临界值 8 static final int TREEIFY_THRESHOLD = 8; 9 //将红黑树转成链表(桶)的临界值10 static final int UNTREEIFY_THRESHOLD = 6;11 //转变成树的table的最小容量,小于该值则不会进行树化12 static final int MIN_TREEIFY_CAPACITY = 64;13 //上图所示的数组,长度总是2的幂次14 transient Node
[] table;15 //map中的键值对集合16 transient Set
> entrySet;17 //map中键值对的数量18 transient int size;19 //用于统计map修改次数的计数器,用于fail-fast抛出ConcurrentModificationException20 transient int modCount;21 //大于该阈值,则重新进行扩容,threshold = capacity(table.length) * load factor22 int threshold;23 //填充因子24 final float loadFactor;

长度为2^n是取模运算快,只需要&(size-1)即可

jdk1.8中 桶中 如果链表长度超过8 会重拍成红黑树,依照hashcode值排序

总数量超过threshold = capacity * loadfactor 会进行resize重拍。需要遍历整个table[],性能较低,如果提前知道map大小,最好在初始化的时候提前设置。

 

在使用iterator迭代器遍历(for each)的时候如果在遍历途中删除map中元素,会抛出ConcurrentModificationException(!!删除倒数第二个不会报错),最好使用iterator内部的删除方法iterator.remove()

 

 hashmap允许key和value为null,线程不安全

转载于:https://www.cnblogs.com/chafanbusi/p/10620958.html

你可能感兴趣的文章
java 多线程踩过的坑
查看>>
部署Replica Sets及查看相关配置
查看>>
倒序显示数组(从右往左)
查看>>
LeetCode2_Evaluate Reverse Polish Notation评估逆波兰表达式(栈)
查看>>
文献综述二:UML技术在行业资源平台系统建模中的应用
查看>>
阿里云服务器 linux下载 jdk
查看>>
Swift 学习 用 swift 调用 oc
查看>>
第三章 Python 的容器: 列表、元组、字典与集合
查看>>
微信小程序开发 -- 点击右上角实现转发功能
查看>>
问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
查看>>
与MS Project相关的两个项目
查看>>
[转载]ASP.NET MVC Music Store教程(1):概述和新项目
查看>>
使用 SharpSvn 执行 svn 操作的Demo
查看>>
js函数大全
查看>>
iOS app exception的解决方案
查看>>
Mongodb启动命令mongod参数说明
查看>>
TCP&UDP压力测试工具
查看>>
oracle 导入数据
查看>>
首个5G智慧机场落地广州 速度是4G的50倍
查看>>
Android 最简单的自定义Dialog之一
查看>>