hcarrasko Asked: 2020-12-18 05:51:04 +0800 CST 2020-12-18 05:51:04 +0800 CST 2020-12-18 05:51:04 +0800 CST JAVA中的HashMap和Hashtable有什么区别? 772 HashMap和 和有什么不一样Hashtable?根据我对数据结构的了解,它在概念上是相同的,但是在Java中,有什么区别? 在使用 的应用程序中更推荐使用Threads哪个? java 3 Answers Voted Best Answer jachguate 2020-12-18T06:14:41+08:002020-12-18T06:14:41+08:00 同步 两者的主要区别在于对象的内部同步。 对于多线程应用程序,最好选择没有同步Hashtable的 over 。HashMap 但是,您必须考虑到它HashTable在访问和变异方法中提供了同步,这将防止两个不同的线程同时从列表中添加或删除,但是多线程应用程序的典型操作需要外部同步. 一个常见的情况是check-and-add,它只不过是查看一个键是否存在于列表中,如果不存在则添加它。Hashtable在使用ni的原子操作中无法做到这一点HashMap。 synchronized(myMap) { if (!myMap.containsKey("tomato")) myMap.put("tomato", "red"); } 对条目的迭代Hashtable也不是线程安全的,除非您通过额外的同步来防止列表被修改: 有接口实现ConcurrentMap(例如)通过包含线程安全的 check-then-act语义来ConcurrentHashMap解决其中一些问题,例如 ConcurrentMap.putIfAbsent(key, value); 空键或值 另一个重要的区别是Hashtable它不允许键或值null,而它HashMap允许一个键和任意数量的值null。 迭代顺序 HashMapis的子类之一LinkedHashMap,在您需要可预测的迭代顺序(默认为插入顺序)的情况下很有用。您可以轻松地将您的声明从 更改HashMap为LinkedHashMap。 来自HashMap 和 Hashtable 之间的差异的信息? Israelm 2020-02-11T15:46:00+08:002020-02-11T15:46:00+08:00 典型的面试问题 HashTable 是一个有点旧的数据结构,虽然他们所说的关于同步的一切都是真的,并且它不允许 null 作为键或值,但我认为值得一提的是,它的层次结构线与映射的层次结构线不同,因为 HastTable 扩展了 Dictionary另一个稍微老式的数据结构,而 HashMap 扩展了 AbstractMap 但都实现了 Map。 Collections 类(Helper Class)中有一个方法,用于创建同步映射,可以帮助我们在程序中替换 HashTables 的使用。 Map m = Collections.synchronizedMap(new HashMap(...)); 您还可以使用同步块实现同步 synchronized(myMap) { } 资料来源:Java Doc Java - grepcode.com 为了更好地理解这些对象是如何工作的,我强烈建议阅读它们的源代码: HashMap源代码: http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/HashMap.java 哈希表源代码: http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable 如果你想为多线程应用程序使用同步映射,java.util 并发包中也有这个对象,它非常有用。 java.util.concurrent.ConcurrentHashMap<K,V> Carlos Muñoz 2020-12-18T06:06:57+08:002020-12-18T06:06:57+08:00 答案改编自:HashMap 和 Hashtable 之间的区别? 两者之间有几个区别: Hashtable它是同步的,HashMap不。在您的情况下,您必须使用Hashtable,因为您提到的应用程序是多线程的。 Hashtable不允许null作为key或value。 HashMap它只允许一个键null,并且没有限制在你想要的任意null 多个值上使用它。 HashMapis的子类之一LinkedHashMap,因此如果您在迭代时想要一个可预测的顺序,您可以将其更改HashMap为LinkedHashMap. Hashtable它没有类似的子类。
同步
两者的主要区别在于对象的内部同步。
对于多线程应用程序,最好选择没有同步
Hashtable
的 over 。HashMap
但是,您必须考虑到它
HashTable
在访问和变异方法中提供了同步,这将防止两个不同的线程同时从列表中添加或删除,但是多线程应用程序的典型操作需要外部同步.一个常见的情况是check-and-add,它只不过是查看一个键是否存在于列表中,如果不存在则添加它。
Hashtable
在使用ni的原子操作中无法做到这一点HashMap
。对条目的迭代
Hashtable
也不是线程安全的,除非您通过额外的同步来防止列表被修改:有接口实现
ConcurrentMap
(例如)通过包含线程安全的 check-then-act语义来ConcurrentHashMap
解决其中一些问题,例如空键或值
另一个重要的区别是
Hashtable
它不允许键或值null
,而它HashMap
允许一个键和任意数量的值null
。迭代顺序
HashMap
is的子类之一LinkedHashMap
,在您需要可预测的迭代顺序(默认为插入顺序)的情况下很有用。您可以轻松地将您的声明从 更改HashMap
为LinkedHashMap
。典型的面试问题
HashTable 是一个有点旧的数据结构,虽然他们所说的关于同步的一切都是真的,并且它不允许 null 作为键或值,但我认为值得一提的是,它的层次结构线与映射的层次结构线不同,因为 HastTable 扩展了 Dictionary另一个稍微老式的数据结构,而 HashMap 扩展了 AbstractMap 但都实现了 Map。
Collections 类(Helper Class)中有一个方法,用于创建同步映射,可以帮助我们在程序中替换 HashTables 的使用。
您还可以使用同步块实现同步
资料来源:Java Doc Java - grepcode.com
为了更好地理解这些对象是如何工作的,我强烈建议阅读它们的源代码:
HashMap源代码: http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/HashMap.java
哈希表源代码: http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable
如果你想为多线程应用程序使用同步映射,java.util 并发包中也有这个对象,它非常有用。
两者之间有几个区别:
Hashtable
它是同步的,HashMap
不。在您的情况下,您必须使用Hashtable
,因为您提到的应用程序是多线程的。Hashtable
不允许null
作为key或value。HashMap
它只允许一个键null
,并且没有限制在你想要的任意null
多个值上使用它。HashMap
is的子类之一LinkedHashMap
,因此如果您在迭代时想要一个可预测的顺序,您可以将其更改HashMap
为LinkedHashMap
.Hashtable
它没有类似的子类。