hashMap

来源:互联网 发布:阿里云logo矢量 编辑:程序博客网 时间:2024/06/17 14:45
原文是http://www.importnew.com/7099.html                    hashMap的工作原理
http://www.codeceo.com/article/why-java-string-class-static.html                       java字符串为什么是不可变对象
http://stackoverflow.com/questions/22890967/java-hashmap-tail-traversing                                     java hashMap tail traversing

http://zhangshixi.iteye.com/blog/672697    深入java集合学习系列
本文只是将我不懂的东西记录下来:

一,一些优秀的开发者会指出使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度。

为何使用不可变对象可以提高效率和安全呢?

因为:

1,安全: 多线程同时操作一个可变对象时,结果不可预测。而不可变对象不会。
2,效率:

2.1 因为不可变,所以可以建立字符串常量池,加速

2.2因为不可变,所以hash值不会变。所以可以算出来后缓存

2.3因为不可变,所以当需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。

二,rehashing时,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)

所谓尾部依赖,是来自于链表的概念。

当链表很长时,每次插入数据若都插到最后一个位置的话,效率就非常低。所以就改为新数据插入头,就快了


三,如果条件竞争发生了,那么就死循环了?   

以及为什么说hashMap不是线程安全的。

看完下面这篇文章后豁然开朗,原文用了大量的图例,我就不复述了~

http://coolshell.cn/articles/9606.html      疫苗:hashMap的死循环





0 0
原创粉丝点击