码迷,mamicode.com
首页 > 其他好文 > 详细

hashMap与hashTable的区别

时间:2018-02-03 15:56:10      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:迭代   term   ast   迭代器   图片   key   fast   -o   方式   

    首先请先阅读这两个的源码。

一、hashMap、hashTable都是Map接口的实现类,但是hashMap类继承自抽象类abstractMap类,hashTable继承自

Dictionary类,该类在jdk中这样描述:

技术分享图片

可见该类已经过时。

二、hashTable里面的方法都是同步的,实现同步的方法是synchronized,hashMap是非同步的,但也可以使用Collections

类中的静态方法使其变得同步。因此在单线程程序中hashMap的效率要高于hashTable,如果在多线程程序中,可以考虑使用

hashTable

三、hashTable不允许有null的键和值,hashMap允许有空的键和值

四、hashMap的遍历是使用方法keySet()返回一个保存有所有键的Set视图,然后用迭代器进行遍历,采用的是fail-fast机制。

hashTable的遍历可以使用elements()返回值的枚举,也可以使用entrySet()keySet()values()返回键的Collection视图,

也可以使用keys()返回键的枚举。总之使用迭代器遍历的都是fail-fast机制,用枚举遍历就不是了,尽量还是得使用迭代器。

import java.util.Enumeration;
import java.util.Hashtable;

public class Test implements Cloneable {
	
	public static void main(String[] args) {
		Hashtable<String,String> ht = new Hashtable<>();
		ht.put("a", "1");
		ht.put("b", "2");
		ht.put("c", "3");
		Enumeration<String> e = ht.keys();
		while(e.hasMoreElements()) {
			ht.remove("b");
			System.out.println(ht.get(e.nextElement()));
		}
	}
}

结果:

null
1
3

五、两者的初始化也有略微的不同

技术分享图片

----------------------------------------------------------------------------------------------

技术分享图片

可见初始化方式都一样,只是初始容量不同,hashMap是16,hashTable为11,hashMap默认必须为2的n次方,以此来使

hash更为均匀,提高hash表的性能。至于为什么默认为0.75,这个应该是经验问题,经过大量程序统计出来的最优值

吧。。

hashMap与hashTable的区别

标签:迭代   term   ast   迭代器   图片   key   fast   -o   方式   

原文地址:http://blog.51cto.com/12222886/2068459

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!