HashMap的学习笔记

  HashMap的存储结构可以理解成数组+链表的结构,但是也不完全这样理解,因为数组查找元素的时候,需要进行遍历,严格来说,数组是一种顺序查找,当数组进行查找的时候,第一个元素找到的时间肯定比最后一个元素找到的时间短。而HashMap不同,因为存在一个Key,这个Key很关键,有了它就可以通过Hash函数找到散列的地址,在找到散列地址下的值,所以查找方式和数组不同。再接着理解链表的结构,Hash函数在计算散列值(也就是散列地址)的时候,会出现散列值相同的情况(碰撞),这个时候就会出现存储在同一个散列地址下的元素,这个解决办法就是通过链表的形式来进行存储多个同散列地址下的元素。

<分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线>

  但是HashMap的精华在于,散列值和索引值的求取。

 static int hash(int h) {
            h ^= (h >>> 20) ^ (h >>> 12);
            return h ^ (h >>> 7) ^ (h >>> 4);
        }
这是JDK1.7的Hash函数,利用Hash函数的若干次位运算,将HashCode变的松散,这样得到的Hash值可以达到充分的散列均匀。

 static int hash(object key) {
            int h;
            return (key == null)?0:(h = key.hashCode())^(h>>>16));
        }
这是JDK1.8的Hash函数,对1.7进行了优化,但是本质没有变化。



对索引值的求取,HashMap默认table(上面所说的类似数组的结构)的长度是16,在通过扰乱后的Hash值进行索引值的计算,也就是table的散列地址

static int indexFor(int h, int length) {
        return h & (length-1);
     }
这里需要说明的是length就是我们的table的长度,h就是我们扰乱后的Hash值,对正常来说,我们将Hash值与长度进行取模,就OK了,但是取余非常慢,我们还有更高效的相与&,进行位相与比取模要快上许多。到这里,还需要了解的是length最好是超过HashMap容量最小2的n次幂,至于为什么要进行减1,那是因为length是偶数的话,进行相与的时候,偶数二进制最低位为0这样会导致table【0】上会散列很多值,而且会使空间很浪费,减1后,奇数二进制最低为1,相与的时候,就会均匀分布。

另外,如果内存足够大,可以考虑使用大的length,这样可以使散列的更加松散,碰撞的几率更加低,get的速度就会更加快,但是会使迭代器的速度变慢,所以在使用的时候预估一下容量是非常有必要的。

<分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线>

还有一点,HashMap是线程不安全的,线程安全可以使用HashTable,那么HashMap线程不安全怎么体现?

如果我有两个线程同时put那么刚好碰撞到一起,那么对出现的覆盖的情况,有个put的数据会被覆盖丢失,当两个线程同时对HashMap进行扩容,在写入新的数据在扩容后的HashMap里面的时候,就会其他线程就会丢失数据。


以上就是我学习HashMap的心得,以后有新的会继续补充。。。

------------------------------------------------------------------------------------------------------------------------------------

2017/9/25  补充说明:HashMap在多线程下不安全,因为其中put方法会很容易发生死循环,具体信息学习笔记重HashMap死循环连接。

内容概要:本文详细介绍了基于滑模控制(SMC)和H∞控制相结合的方法应用于永磁直线同步电机(PMLSM)的鲁棒控制。首先阐述了PMLSM的基本数学模型及其物理意义,包括d-q坐标系下的电压方程和运动方程。随后解释了滑模控制的工作原理,重点在于如何构建滑模面并确保系统沿此面稳定运行。接着讨论了H∞控制的目标——即使在不确定条件下也能保持良好的性能表现。文中还提供了具体的Matlab代码实例,展示了如何利用Matlab控制系统工具箱进行H∞控制器的设计。最后给出了一段完整的Matlab程序框架,演示了两种控制方法的具体实现方式。 适合人群:从事电机控制领域的研究人员和技术人员,尤其是那些想要深入了解滑模控制和H∞控制理论及其在实际工程中应用的人士。 使用场景及目标:适用于需要提高永磁直线同步电机控制系统抗干扰能力和鲁棒性的场合,如工业自动化生产线、精密加工设备等。通过学习本篇文章提供的理论知识和编程技巧,读者能够掌握这两种先进控制策略的应用方法,从而提升自身解决复杂控制问题的能力。 其他说明:文中所涉及的内容不仅限于理论讲解,还包括了大量的实战经验分享,有助于读者快速上手并在实践中不断改进自己的设计方案。同时鼓励读者积极尝试不同的参数配置,以便找到最适合特定应用场景的最佳解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值