java中hashmap的实现原理以及hashmap的正确使用

来源:互联网 发布:随身淘宝:皇家小地主》 编辑:程序博客网 时间:2024/05/07 15:34

http://www.cnblogs.com/skywang12345/p/3323085.html

上面网址是博客园一位博主总结的关于java结合类的深入理解,个人认为总结的很深入全面,而且容易理解。读者可以参考里面的文章。


关于正确的使用hashmap:

1:不要在并发场景中使用HashMap
           HashMap是线程不安全的,如果被多个线程共享的操作,将会引发不可预知的问题,据sun的说法,在扩容时,会引起链表的闭环,在get元素时,就会无限循环,后果是cpu100%。
看看get方法的红色部分

Java代码  收藏代码
  1. public V get(Object key) {  
  2.     if (key == null)  
  3.         return getForNullKey();  
  4.         int hash = hash(key.hashCode());  
  5.         for (Entry<K,V> e = table[indexFor(hash, table.length)];  
  6.              e != null;  
  7.              e = e.next) {  
  8.             Object k;  
  9.             if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
  10.                 return e.value;  
  11.         }  
  12.         return null;  
  13.     }  
 


2:如果数据大小是固定的,那么最好给HashMap设定一个合理的容量值
        根据上面的分析,HashMap的初始默认容量是16,默认加载因子是0.75,也就是说,如果采用HashMap的默认构造函数,当增加数据时,数据实际容量超过10*0.75=12时,HashMap就扩容,扩容带来一系列的运算,新建一个是原来容量2倍的数组,对原有元素全部重新哈希,如果你的数据有几千几万个,而用默认的HashMap构造函数,那结果是非常悲剧的,因为HashMap不断扩容,不断哈希,在使用HashMap的场景里,不会是多个线程共享一个HashMap,除非对HashMap包装并同步,由此产生的内存开销和cpu开销在某些情况下可能是致命的。


0 0
原创粉丝点击