hashtable底层实现原理,hashtable数据结构
Hashtable的应用非常广泛,HashMap是新框架中代替Hashtable的类。 也就是说,建议使用HashMap,不要使用Hashtable。 你可能觉得Hashtable很好用,为什么不用呢? 我在这里简要分析他们的差异。
1 .因为1.Hashtable方法是同步的,而HashMap是不同步的,所以在多线程情况下手动同步HashMap的区别就像Vector和ArrayList一样。
查看Hashtable的源代码时,除了构造函数之外,Hashtable的所有公共方法声明都有synchronized关键字,但HashMap的源代码中也没有synchronized的阴影当然,评论除外。
2.Hashtable不允许空值。 (key和value都不可以),HashMap允许空值。 ) key和value都可以)。
首先,我们来看看Hashtable的常规输出示例。
Hashtable table=new Hashtable (; table.put(a-key )、(a-value ); table.put(B-key )、(b-value ); table.put(c-key )、(c-value ); 输出如下。
请看壮观的刺猬Hashtable拒绝null的例子:
table.put(null,' a-value ' ); 执行后的异常如下
exceptioninthread ' main ' Java.lang.nullpointerexceptionatjava.util.hashtable.put (hashtable.Java 3360399 ) atcoon
HashMap map=new HashMap (; map.put (空,' a-value ' ); map.put(B-key )、null ); map.put(c-key )、null );
运行后,输出如下所示。
B- key-null null-a-valuec-key-null
PS:可以从上面的示例中发现Hashtable与HashMap的相同之处。 也就是说,是无序保管。
3 .两者扫描方式大同小异,Hashtable比HashMap多一种elements方法。
Enumeration em=table.elements (; while(em.hasmoreelements () (stringobj=) string ) em.nextElement ); system.out.println(obj; }
Hashtable和HashMap都通过values ()方法返回Collection进行遍历。
Collection coll=map.values (; Iterator it=coll.iterator (; while(it.Hasnext () (stringobj=) string ) it.next ); system.out.println(obj; }
两者都可以通过entrySet ()方法返回Set进行遍历处理。
Set set=table.entrySet (; Iterator it=set.iterator (; while(it.Hasnext () (输入项=)输入项) it.next ); system.out.println (entry.getkey () '- ' entry.getValue ) ); }
4.HashTable使用枚举,HashMap使用迭代器
以下两点是从内部实现机制进行比较的。
明白了:
5 .哈希值的使用不同。 Hashtable直接使用对象的hashCode。 代码如下所示。
int hash=key.hashCode (; intindex=(hash0x7fffffff ) % tab.length;
混列映射重新计算混列值,并使用和而不是求出类型。
inthash=hash(k; intI=indexfor(hash,table.length ); staticinthash(objectx ) {int h=x.hashCode; h=~~(h9; h^=(h14; h=(h4 ); h^=(h10; 返回h; }staticintindexfor(inth,int length ) returnh (length-1 );
6 .在6.Hashtable中,hash数组的默认大小为11,以old*2 1递增。 混列散列数组的默认大小为16,并且必须是2的指数。