hashmap 的一些研究
来源:互联网 发布:大襟绸缎面花棉袄淘宝 编辑:程序博客网 时间:2024/05/01 12:27
今天面试被问到hashmap 的有关东西,结果这个很经典的结构我是了解它的原理,可是在语言中的具体实现原理还是不清楚的,仅仅是用过而已,所以回答的。。现在深入的整理一下:
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。你可以查看更多的关于HashMap的文章:
5、影响HashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
6、元素数超过桶数,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。c++ 是选择质数表中的下一个指数。
7、重新调整HashMap大小存在什么问题 -》 多线程下的不安全。。
因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。 (理解上。。)
HashMap 和 HashTable 的区别
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
- hashmap 的一些研究
- Java的Hashmap机制研究
- HashMap研究
- 研究HashMap
- ViewDragHelper的一些研究
- 关于HashMap的一些点、、、
- 关于HashMap的一些问题
- 关于HashMap的一些讨论
- HashMap,LinkedHashMap 和 TreeMap 的排序研究
- 让类做HashMap的键-容器深入研究
- HashMap的内部实现-容器深入研究
- 表单研究的一些收获
- 研究算法的一些想法
- 对CURL的一些研究
- 对CURL的一些研究
- 对CURL的一些研究
- 对CURL的一些研究
- php-memcached的一些研究
- 深入dwr2之三 Dwr2页面请求处理机制分析之engine.js
- CentOS-6.3安装配置Tomcat-7
- 链表逆序
- Lua 检测全局表重复赋值
- Android开发之LisitView的图文并排效果实现(源代码分享)
- hashmap 的一些研究
- 关于VBS调用MSWinsock控件
- C++ primer plus 1-3
- AS3.0中的事件类型分类
- mybaties基础教程之四:SQL语句映射文件(1)
- 黑马程序员---java多线程学习总结
- shader 学习
- 解决SlidingMenu 侧滑与ViewPager冲突问题
- 小菊花小姐哈