- 当「对象的创建逻辑简单」,通常只需要new一下就可以,此时可以考虑「简单工厂模式」
- 当「对象的创建逻辑很复杂」,需要做各种初始化操作,此时可以考虑使用「工厂方法模式」,将对象创建的复杂逻辑拆分到各个工厂类中,让每个工厂类都不至于过于复杂
- 当「系统中有多于一个产品族」,而每次只使用其中某一产品族,此时使用「抽象工厂模式」
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
策略模式,可用于替换if else
哈希函数,返回int型散列值
如果直接拿散列值作为下标访问HashMap主数组的话,考虑到2进制32位带符号的int表值范围从
2147483648-2147483648
散列值与数组长度取模运算
h&(length-1)
低位掩码
与”操作的结果就是散列值的高位全部归零,只保留低位值,用来做数组下标访问
但这时候问题就来了,这样就算我的散列值分布再松散,要是只取最后几位的话,碰撞也会很严重。更要命的是如果散列本身做得不好,分布上成等差数列的漏洞,恰好使最后几个低位呈现规律性重复,就无比蛋疼。
扰动函数
右位移16位,正好是32bit的一半,自己的高半区和低半区做异或,就是为了
混合原始哈希码的高位和低位,以此来加大低位的随机性
。而且混合后的低位掺杂了高位的部分特征,这样高位的信息也被变相保留下来。
从而做到更小的哈希碰撞
选择值31是因为它是奇数素数。如果是偶数且乘法溢出,则信息将丢失,因为乘2等于移位。使用素数的优点不太明显,但它是传统的。31的一个很好的特性是,乘法可以用移位和减法来代替,以获得更好的性能:31*i==(i<<5)-i。现代虚拟机自动进行此类优化。
redis原子操作 setnx() 如果key没有值,则将值设置进去,如果已有值就不做处理,提示失败 锁
Lua脚本 Redis中某个值是否满足条件,只有满足条件才做这个操作 cas
为什么Lua脚本可以实现原子操作