第一回
HashMap源码实现
hashCode()
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
hash = h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
}
return h;
}
可以对字符串取一个哈希值(超级有用),唯一识别这个字符串的值的
hash结构
新数据存入算出一个哈希值,用得到的hash值和数组长度取余,得到的值就被限定在数组长度大小的范围内了。如果此时数据中有值,链表头插下移。
jdk1.7的hashmap
调用有参构造,默认的DEFAULT_INITIAL_CAPACITY是16,默认的DEFAULT_LOAD_FACTOR是0.75
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)//判断是否合法
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
初始化数组容量是一个2的次方数
highestOneBit()函数
highestOneBit是Integer中的方法,传入一个数字,会返回<=这个数字的2的次方数
讲解:
将输入的数转换成2进制,为了范化例子,举例0001 xxxx,x表示0、1任意数字
第一次运算,右移之后做或运算,得到0001 1xxx
第二次运算之后变成0001 111x
。。。
最后变成 0001 1111
最后一步i-(i>>>1),(i>>>1),先右移一位,变成0000 1111,再用原来的0001 1111-00001111,得到0001 0000,这样就把原数除了最高位全部清0了。又因为这是二进制,所以得到的结果一定是比输入的数小的最大的2的次方数。
roundUpToPowerOf2()
因为这个函数调用了上个函数,实现的功能是返回大于当前数的最小的2的次方数
java中的位运算
15min