hashtable和hashmap的区别

发布时间:2024-08-14 14:39:13 来源:君肯网

hashmap和hashtable的区别:

一、hash数组默认大小不同

1、HashMap:HashMap中 hash数组的默认大小是16,而且一定是2的指数。

2、Hashtable:HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

二、线程安全不同

HashMap不是线程安全的,HashTable是线程安全。HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

三、null不同

ashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

C#中HashTable用法和Dictionary比较

Hashtable-哈希表类\x0d\x0a\x0d\x0a以哈希表的形式存储数据,数据的形式是键值对.\x0d\x0a特点:\x0d\x0a查找速度快,遍历相对慢\x0d\x0a键值不能有空指针和重复数据\x0d\x0a\x0d\x0a创建\x0d\x0aHashtable ht=new \x0d\x0aHashtable()\x0d\x0a\x0d\x0a添值\x0d\x0a\x0d\x0aht.put(1,”Andy”)\x0d\x0aht.put(2,”Bill”)\x0d\x0aht.put(3,”Cindy”)\x0d\x0aht.put(4,”Dell”)\x0d\x0aht.put(5,”Felex”)\x0d\x0aht.put(6,”Edinburg”)\x0d\x0aht.put(7,”Green”)\x0d\x0a\x0d\x0a取值\x0d\x0a\x0d\x0aString str=ht.get(1)\x0d\x0aSystem.out.println(str)// Andy\x0d\x0a\x0d\x0a对键进行遍历\x0d\x0a\x0d\x0aIterator it = ht.keySet().iterator()\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0aInteger key = (Integer)it.next()\x0d\x0a\x0d\x0aSystem.out.println(key)\x0d\x0a}\x0d\x0a\x0d\x0a对值进行遍历\x0d\x0a\x0d\x0aIterator it = ht.values().iterator()\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0aString value =(String) it.next()\x0d\x0a\x0d\x0aSystem.out.println(value)\x0d\x0a}\x0d\x0a\x0d\x0a取Hashtable记录数\x0d\x0a\x0d\x0aHashtable ht=new Hashtable()\x0d\x0a\x0d\x0aht.put(1,”Andy”)\x0d\x0aht.put(2,”Bill”)\x0d\x0aht.put(3,”Cindy”)\x0d\x0aht.put(4,”Dell”)\x0d\x0aht.put(5,”Felex”)\x0d\x0aht.put(6,”Edinburg”)\x0d\x0aht.put(7,”Green”)\x0d\x0a\x0d\x0aint i=ht.size()// 7\x0d\x0a\x0d\x0a删除元素\x0d\x0a\x0d\x0aHashtable ht=new Hashtable()\x0d\x0a\x0d\x0aht.put(1,”Andy”)\x0d\x0aht.put(2,”Bill”)\x0d\x0aht.put(3,”Cindy”)\x0d\x0aht.put(4,”Dell”)\x0d\x0aht.put(5,”Felex”)\x0d\x0aht.put(6,”Edinburg”)\x0d\x0aht.put(7,”Green”)\x0d\x0a\x0d\x0aht.remove(1)\x0d\x0aht.remove(2)\x0d\x0aht.remove(3)\x0d\x0aht.remove(4)\x0d\x0a\x0d\x0aSystem.out.println(ht.size())// 3\x0d\x0a\x0d\x0aIterator it = ht.values().iterator()\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0a// Get value\x0d\x0aString value =(String) \x0d\x0ait.next()\x0d\x0aSystem.out.println(value)\x0d\x0a}

hashtable和hashmap的区别是什么?

一、哈希表(Hashtable)用法

二、哈希表(Hashtable)和字典(Dictionary)的比较

1.添加数据时Hashtable快。频繁调用数据时Dictionary快。

Dictionary&ltK,V&gt是泛型的,当K或V是值类型时,其速度远远超过Hashtable。

2.由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.

[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.

[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.

[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

HashMap和Hashtable的区别

1、继承的父类不同

Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2、线程安全性不同

javadoc中关于hashMap的一段描述如下:此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步Hashtable 中的方法是Synchronize的。

3、contains方法不同

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。

Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

4、key和value是否允许null值

hashtable和hashmap的区别

Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

5、两个遍历方式的内部实现上不同

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。

这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。

fail-fast会在以下两种情况下抛出ConcurrentModificationException

集合被创建后,在遍历它的过程中修改了结构。

注意 remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。

当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

迭代器在遍历过程中是直接访问内部数据的,因此内部的数据在遍历的过程中无法被修改。为了保证不被修改,迭代器内部维护了一个标记 “mode” ,当集合结构改变(添加删除或者修改),标记”mode”会被修改,而迭代器每次的hasNext()和next()方法都会检查该”mode”是否被改变,当检测到被修改时,抛出Concurrent Modification Exception。

下面看看ArrayList迭代器部分的源码。

可以看到它的标记“mode”为 expectedModeCount。

fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException。

fail-safe机制有两个问题

HashMap可以通过下面的语句进行同步:

Map m = Collections.synchronizeMap(hashMap)

Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

以上就是关于hashtable和hashmap的区别全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

更多相关资讯

hashmap和hashtable的区别: 一、hash数组默认大小不同 1、HashMap:HashMap中 hash数组的默认大小是16…
查看详情
hashmap和hashtable的区别: 一、hash数组默认大小不同 1、HashMap:HashMap中 hash数组的默认大小是16…
查看详情
hashmap和hashtable的区别: 一、hash数组默认大小不同 1、HashMap:HashMap中 hash数组的默认大小是16…
查看详情
相关文章
推荐游戏
风之谷
风之谷
游戏资讯 10.5M
下载
斗罗大陆3
斗罗大陆3
游戏资讯 566.9M
下载
冠军网球
冠军网球
游戏资讯 148.1M
下载
最佳炮手
最佳炮手
游戏资讯 68.1M
下载
如梦下弦月
如梦下弦月
游戏资讯 840.1M
下载
富甲封神传
富甲封神传
游戏资讯 263.0M
下载