判断一个数是否是偶数,你真的仔细去考虑过么

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

判断⼀个数是否是偶数,你真的仔细去考虑过么
怎样判断⼀个数是否是偶数,正常学的差不多的都会知道说⽤这个数去%2,我们可以挖⼀下,这个模2是怎么出来的,是通过&1,这个是底层的算法,然后我们再挖深下,&1的底层是,假如3&1也就是011和001做与运算,⼆进制转换⼗进制怎么整的,不就是2的n-1次⽅么,所以只要计算第⼀位的与运算就知道这个数是否是奇数还是偶数了
其实Javase的⼀些源码也可以看到很多这些影⼦,
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
//将key做hash算法
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
从这段代码可以看出,hashmap通过将key做hash算法,然后通过hash值映射到内存地址,取得key所对应的数据。

平时都知道hashMap 的底层数据结构⽤的是数组,这么整下来数组的下标索引也就是内存地址了,通过上述代码看到hash()的实现全部基于位运算,⽽位运算⽐算数,逻辑运算快,通过indexFor()将hash值与数组长度按位取与得到数组索引,返回数组的索引直接通过数组下标便可以取得对应的值,内存访问的速度也快,也可以看到hashMap的性能可见⼀斑
通过判断某个数是否是偶数,去理解indexFor()到底为何这么⽤,这就是为何说源码是最好的教科书的所在。

相关文档
最新文档