HashMap
HashMap本质就是数据结构上学的链地址法(参考第十四周PPT)
1.loadFactor
loadFactor是map的负载因子,loadFactor <= 0 || Float.isNaN(loadFactor),表明负载因子要大于0,且是非无穷大的数字
为什么负载因子默认值为0.75?
0.75在权衡了 负载因子过小而导致哈希碰撞带来的时间影响和 负载因子过大带来的空间浪费后权衡的结果,并且0.75乘上 容量后为整数
https://blog.csdn.net/QL753123/article/details/105920297
2.initialCapacity
initialCapacity即为容量(可以理解为数组部分)
并且初始值为 16
hash运算的过程其实就是对目标元素的Key进行hashcode,再对Map的容量进行取模,而JDK 的工程师为了提升取模的效率,使用位运算代替了取模运算,这就要求Map的容量一定得是2的幂。
而作为默认容量,太大和太小都不合适,所以16就作为一个比较合适的经验值被采用了。为了保证任何情况下Map的容量都是2的幂,HashMap在两个地方都做了限制。
https://zhuanlan.zhihu.com/p/96130070
3.JDK 1.8前后区别
PUT时,
JDK1.8前未使用红黑树,从头部插入(也就是说数组中存储的是最后插入的元素)
JDK1.8后加入了红黑树,从尾部插入
https://blog.csdn.net/tc_1337/article/details/81700672
HashMap
链接
红黑树
红黑树漫画版
判断重复字符
在上面的流程中,我们还需要使用一种数据结构来判断 是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。
i++和++i在for 和while中区别
在for 和while i++ 和 ++i 的作用是一样的。
Java中i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要。这样就导致使用i++时系统需要先申请一段内存空间,然后将值赛如进去,最后不用了才去释放。多了这么一系列操作时间当然多了