hashtable的区别和优缺点 - java hashtable用法




HashMap和Hashtable之间的区别? (20)

1. HashmapHashTable都存储密钥和值。

2. Hashmap可以将一个键存储为nullHashtable无法存储null

3. HashMap未同步但Hashtable已同步。

4. HashMap可以与Collection.SyncronizedMap(map)同步

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

Java中的HashMapHashtable有什么区别?

哪个非线程应用程序更有效?


HashTable和HashMaps有5个基本区别。

  1. Maps允许您迭代和检索键,值和两个键值对,其中HashTable没有所有这些功能。
  2. 在Hashtable中有一个函数contains(),它使用起来非常混乱。 因为contains的含义略有偏差。 是否包含密钥或包含值? 难以理解。 在Maps中我们有ContainsKey()和ContainsValue()函数,它们很容易理解。
  3. 在hashmap中,您可以安全地在迭代时删除元素。在哈希表中不可能的地方。
  4. HashTable默认是同步的,因此可以轻松地与多个线程一起使用。默认情况下,HashMaps不同步,因此只能与单个线程一起使用。但您仍然可以使用Collections util类的synchronizedMap(Map m)函数将HashMap转换为同步。
  5. HashTable不允许使用null键或null值。HashMap允许一个空键和多个空值的位置。

Java中的HashMapHashtable有几点不同:

  1. Hashtablesynchronized ,而HashMap则不是。 这使得HashMap更适合非线程应用程序,因为非同步对象通常比同步对象执行得更好。

  2. Hashtable不允许使用null键或值。 HashMap允许一个null键和任意数量的null值。

  3. HashMap的子类之一是LinkedHashMap ,因此如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地为LinkedHashMap换出HashMap 。 如果您使用Hashtable这将不那么容易。

由于同步对您来说不是问题,我建议使用HashMap 。 如果同步成为问题,您还可以查看ConcurrentHashMap


hashtable和hashmap之间的另一个关键区别是HashMap中的Iterator是快速失​​败的,而Hashtable的枚举器不是,如果任何其他Thread通过添加或删除除Iterator自己的remove()方法之外的任何元素来修改地图,则抛出ConcurrentModificationException。 但这不是一种保证行为,将由JVM尽最大努力完成。“

我的来源: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.htmlhttp://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


HashMapMap接口的一种实现,它使用哈希代码索引数组。 Hashtable :嗨,1998年叫。 他们想要回收他们的集合API。

说真的,你最好远离Hashtable 。 对于单线程应用程序,您不需要额外的同步开销。 对于高度并发的应用程序,偏执同步可能会导致饥饿,死锁或不必要的垃圾收集暂停。 就像Tim Howland所指出的那样,你可能会使用ConcurrentHashMap


HashMapHashtable也有很大的算法差异。 之前没有人提到这个,所以这就是我提出这个问题的原因。 HashMap将构造一个具有两个大小的哈希表,动态地增加它,这样你在任何桶中最多只有八个元素(冲突),并且会很好地激发一般元素类型的元素。 但是,如果您知道自己在做什么, Hashtable实现可以更好,更精细地控制散列,即您可以使用最接近的素数来修复表大小,这将导致比HashMap更好的性能,即更少某些情况下的碰撞。

除了在这个问题中广泛讨论的显而易见的差异之外,我认为Hashtable是一个“手动驱动”汽车,你可以更好地控制散列和HashMap作为通常表现良好的“自动驱动”对应物。


Hashtable类似于HashMap并且具有类似的接口。 建议您使用HashMap ,除非您需要支持遗留应用程序或需要同步,因为Hashtables方法是同步的。 因此,在您的情况下,因为您不是多线程, HashMaps是您最好的选择。


Hashtable被视为遗留代码。 Hashtable无法使用HashMapHashMap派生来完成,所以对于新代码,我认为没有任何理由可以回到Hashtable


Hashtable:

Hashtable是一种保留键值对值的数据结构。它不允许键和值都为null。NullPointerException如果添加空值,您将得到一个。它是同步的。所以它带来了它的成本。只有一个线程可以在特定时间访问HashTable

示例

import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}

HashMap的:

HashMap类似于Hashtable,但它也接受键值对。它允许键和值都为null。它的性能更好HashTable,因为它是unsynchronized

例:

import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}

HashMap和HashTable

  • 关于HashMap和HashTable的一些重要观点。请阅读以下详细信息。

1)Hashtable和Hashmap实现java.util.Map接口2)Hashmap和Hashtable都是基于哈希的集合。并致力于散列。所以这些是HashMap和HashTable的相似之处。

  • HashMap和HashTable有什么区别?

1)第一个区别是HashMap不是线程安全的,而HashTable是ThreadSafe
2)HashMap在性能方面更好,因为它不是线程安全的。虽然Hashtable性能明智并不好,因为它是线程安全的。所以多线程不能同时访问Hashtable。


HashMaps为您提供了同步自由,调试更加轻松


HashMap: - 它是java.util包中可用的类,它用于以键和值格式存储元素。

Hashtable: - 它是一个遗留类,在集合框架中被识别


对于线程应用程序,您可以经常使用ConcurrentHashMap - 取决于您的性能要求。


已发布许多好的答案。 我添加了一些新的点并总结了它。

HashMapHashtable都用于以键和值的形式存储数据 。 两者都使用散列技术来存储唯一键。 但是下面给出了HashMap和Hashtable类之间的许多区别。

HashMap中

  1. HashMap是非同步的。 它不是线程安全的,如果没有适当的同步代码,就无法在许多线程之间共享。
  2. HashMap允许一个空键和多个空值。
  3. HashMap是JDK 1.2中引入的新类。
  4. HashMap很快。
  5. 我们可以通过调用此代码使HashMap同步
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap由Iterator遍历。
  7. HashMap迭代器是快速失败的。
  8. HashMap继承了AbstractMap类。

哈希表

  1. Hashtable是同步的。 它是线程安全的,可以与许多线程共享。
  2. Hashtable不允许任何null键或值。
  3. Hashtable是一个遗留类。
  4. Hashtable很慢。
  5. Hashtable在内部同步,不能不同步。
  6. Hashtable由Enumerator和Iterator遍历。
  7. Hashtable枚举器不是快速失败的。
  8. Hashtable继承了Dictionary类。

进一步阅读Java中的HashMap和Hashtable有什么区别?


根据here的信息,我建议使用HashMap。 我认为最大的优点是Java会在你迭代它时阻止你修改它,除非你通过迭代器完成它。


看看这张图表。 它提供了不同数据结构与HashMap和Hashtable之间的比较。 比较准确,清晰,易于理解。

Java Collection Matrix


请记住,在引入Java Collections Framework(JCF)之前, HashTable是遗留类,后来为了实现Map接口而进行了改进。 VectorStack

因此,总是在新代码中远离它们,因为在JCF中总有更好的替代方案,正如其他人所指出的那样。

这是您将发现有用的Java集合备忘单 。 请注意,灰色块包含遗留类HashTable,Vector和Stack。


除了izb所说的, HashMap允许空值,而Hashtable则不允许。

另请注意, Hashtable扩展了Dictionary类,它作为Javadocs状态已过时并已被Map接口替换。


除了这里已经提到的所有其他重要方面,Collections API(例如Map接口)一直在被修改,以符合Java规范的“最新和最好”的补充。

例如,比较Java 5 Map迭代:

for (Elem elem : map.keys()) {
  elem.doSth();
}

与旧的Hashtable方法相比:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

在Java 1.8中,我们还承诺能够构建和访问HashMaps,就像在旧的脚本语言中一样:

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

更新:不,他们不会降落在1.8 ...... :(

Project Coin的集合增强功能将在JDK8中进行吗?


1)Hashtable是同步的,而hashmap不是。2)另一个区别是HashMap中的迭代器是故障安全的,而Hashtable的枚举器则不是。如果你在迭代时更改地图,你就会知道。

3)HashMap允许空值,而Hashtable则不允许。





hashtable