管中窥豹:Hashtable源码学习

学习自:

http://www.cnblogs.com/skywang12345/p/3310887.html
https://segmentfault.com/a/1190000008982905

      网上能搜到很多相关链接,加之平时在项目中几乎没怎么见到,所以看我给出的链接即可。着重看下面我提出的问题,带着问题去思考可能更好。

问题

1.Hashtable是不是线程安全的?为什么?
      Hashtable是线程安全的。因为其主要的方法均采用synchronized(同步锁)修饰。


2.Hashtable初始容量为何是11?
      参考:https://www.zhihu.com/question/29587252Hashtable默认大小是11是因为除(近似)质数求余的分散效果好。
      1.8版本中Hashtable通过rehash()进行容量自增,里面有一段代码:

1
2
3
4
5
6
7
8
9
10
int newCapacity = (oldCapacity << 1) + 1;
if (newCapacity - MAX_ARRAY_SIZE > 0) {
if (oldCapacity == MAX_ARRAY_SIZE)
// Keep running with MAX_ARRAY_SIZE buckets
return;
newCapacity = MAX_ARRAY_SIZE;
}
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];
...
table = newMap;

      不难看出,先将容量自增为原容量的2倍+1,然后拿新容量与Integer.MAX_VALUE - 8比较,超出的话直接让容量等于Integer.MAX_VALUE - 8。最终将新容量数组赋值给table

      这样操作虽然不保证容量是一个质数,但起码能保证容量是一个奇数。


3.rehashint index = (e.hash & 0x7FFFFFFF) % newCapacity;这段怎么理解?https://stackoverflow.com/questions/9380670/why-does-java-use-hash-0x7fffffff-tab-length-to-decide-the-index-of-a-key
      这一步是为了计算扩容后的索引值。e.hash & 0x7FFFFFFF会返回一个正数,% newCapacity控制index索引在容量范围内部。


4.HashMapHashtable在有很多相似的功能,那么为什么还需要他们两个同时存在?

  1. Hashtabel继承自Dictionary,HashMap继承自AbstractMapDictionary类已经废弃。
  2. Hashtabel是线程安全的,而HashMap不是。HashMapkeyvalue可以为null,但是Hashtable不行。
  3. Hashtabel在java 1.1 时就有了,而HashMap是 java 1.2 才有的。在使用时一般用ArrayList代替Vector,LinkedList代替Stack,HashMap代替HashTable,即使在多线程中需要同步,也是用同步包装类。
  4. 对于哈希值的使用也有所不同,HashTable直接使用对象的hashCode,而HashMap重新计算hash值。而且用与代替求模。
    1
    2
    3
    4
    5
    6
    7
    8
    Hashtable中:
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    HashMap中
    static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
Newer Post

管中窥豹:HashSet源码学习

学习自:http://www.cnblogs.com/skywang12345/p/3311252.html &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;阅读HashSet的源码发现很有意思,四个`public修饰的构造函数内部全是new一个HashMap的实例,还有一个 …

继续阅读
Older Post

管中窥豹:HashMap原理学习以及jdk1.8版本中源码的变更

学习自https://mp.weixin.qq.com/s/1bmNx-gw5-2jucn6i8XfZwhttps://www.cnblogs.com/skywang12345/p/3310835.htmlhttps://blog.csdn.net/unscdf117/article/details …

继续阅读