一、基础知识夯实
1.首先是我们需要懂得几点是在java中的集中运算
直接看代码吧
public class IntToBinary { public static void main(String[] args) throws UnsupportedEncodingException { int data = 4; System.out.println("the 4 is "+Integer.toBinaryString(data)); //位与 &(1&1=1 1&0=0 0&0=0) System.out.println("the 4 is "+Integer.toBinaryString(4)); System.out.println("the 6 is "+Integer.toBinaryString(6)); System.out.println("the 4&6 is "+Integer.toBinaryString(4&6)); //位或 | (1|1=1 1|0=1 0|0=0) System.out.println("the 4|6 is "+Integer.toBinaryString(4|6)); //位非~(~1=0 ~0=1) System.out.println("the ~4 is "+Integer.toBinaryString(~4)); //位异或 ^ (1^1=0 1^0=1 0^0=0)(有相同的就是 1 ) System.out.println("the 4^6 is "+Integer.toBinaryString(4^6)); // <<有符号左移 >>有符号的右移 >>>无符号右移 System.out.println("the 1 << 4 is "+Integer.toBinaryString(4 << 1)); System.out.println("the 1 >>> 4 is "+Integer.toBinaryString(4 >>> 1)); //取模的操作 a % (2^n) 等价于 a&(2^n-1) System.out.println("the 345 % 16 is "+(345%16)+ " or "+(345&(16-1))); } }
总结:我们知道的是,位运算是再接再2进制操作的,其他的运算也是最后要转化为 2 进制运算的,所以周期要长。
2.什么是hash:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,
所有散列函数都有如下一个基本特性:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同。
两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。衡量一个哈希函数的好坏的重要指标就是发生碰撞的概率以及发生碰撞的解决方案。任何哈希函数基本都无法彻底避免碰撞,常见的解决碰撞的方法有以下几种:1.开放寻址;2、再散列;3、链地址法(相同hash值的元素用链表串起来)。
3.比较 HashTable、HashMap、ConcurrentHashMap;
4.现在我们先说一下,为什么HashMap在高并发下是不安全的,原因是:在多线程情况下,会导致hashmap出现链表闭环,一旦进入了闭环get数据,程序就会进入死循环,所以导致HashMap是非线程安全的。
具体的可以参考文章:https://blog.csdn.net/qq_32534441/article/details/84202979
原文地址:https://www.cnblogs.com/lys-lyy/p/11072796.html
时间: 2024-11-08 20:58:43