Java基础总结

来源:互联网 发布:淘宝有情侣网店吗 编辑:程序博客网 时间:2024/06/05 20:32
Java基础总结 - 线程安全的Map
这篇文章只是把大学记的笔记整理到博客,方便自己查看,不保证权威性(•̀ᴗ•́)و ̑̑
1.  使用Collections类的synchronizedMap方法包装一下,类似于装饰者模式传入一个map对象,里面有很多synchronize方法,实际上调用的就是我们传入map的方法
2.  Hashtable基本上可以看作一个线程安全版的HashMap,有下面不同点
1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、key和value是否允许null值
Hashtable中,key和value都不允许出现null值。
3、hash值不同
HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,
且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,
而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。
4、内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。
5、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
6、两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
7.没按驼峰规则
3.juc的concurrentHashMap,见下篇帖子
原创粉丝点击