哈希表和散列表的区别

5

可能是重复问题:
HashMap和Hashtable之间的区别?

我前几天去参加了一次面试,面试官问我在什么情况下使用hashmap会有问题而使用hashtable可以解决问题? 也就是说,给出一个例子,其中使用hashtmap会导致问题,但使用hashtable将解决问题。

他告诉我代码运行的机器是单核的!

我举了一个例子。

Time        Thread1            Thread 2
   t0    tb.put("a",1)       
   t1     tb.put("a",2)          int a = tb.get("a"); 

我说如果在t1时刻t1和t2同时执行,那么会导致问题。他说由于它是单核CPU,它永远不会并行执行两个语句。
有人能澄清一下吗?什么情况下会出现问题?有任何例子吗?
编辑:我通过交换hashmap和hashtable发布了问题。我知道hashtable方法是同步的,而hashmap方法则不是,并且我已经告诉他了。
为了进行实验,我实现了以下内容。代码从未崩溃过吗?我没有使用hashtable,但在A中它仍然是一个hashmap :)
public class MyT extends Thread {

    HashMap<String,String > a = A.t;
    @Override
    public void run() {
        while (true) {
            a.put("a", "one");
            System.out.println(Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        MyT t1 = new MyT();
        t1.start();
        MyT t2 = new MyT();
        t2.start();
    }
}

4
Pointy-Hair先生可能认为tb.put/tb.get只包含一个CPU指令 :) - Ryan Fernandes
5个回答

3

1
@Jaomos:我知道Hashtable的方法是同步的,而Map的方法不是。给我一个会失败的例子。别太聪明了,我也是Java程序员,不是新手。 - Akshay

2
与新的集合实现不同,Hashtable 是同步的。这就是为什么我可以想象使用 HashMap 会创建问题的情况,而使用 Hashtable 将解决它。
它是单核的事实并不重要:如果 Thread1put 调用中间被抢占,那么 Thread2 将看到一个不一致的状态,并可能崩溃。

3
面试是一个双向过程。如果你说了一些正确的话,但他(尤其是在他选择的主题上)却认为是错误的,这就说明了他的一些问题。如果这个人是你未来要共事的人,这可能是一个警示信号。 - yshavit

0

仅仅因为它是单核的,并不意味着你不能出现竞态条件。这可能(很可能?)意味着你不会有内存可见性问题,但你肯定可以在单个核心上运行多个线程,并且它们仍然可以被调度,以便你获得竞态条件。


0

这里有一个不错的链接,你可以参考一下:HashMap和Hashtable之间的区别是什么?

我在想他们是否像你说的那样问了你,因为似乎他想问哪个是线程安全的,哪个不是。

Hashtable是线程安全的,但为什么他会问Hashtable的问题呢?


0

在这种情况下,同步是使用哈希表的主要原因。即使在这种情况下只使用单个核心,也不能保证tb.put("a",2)在调用tb.get("a")之前完成执行。

这可能会导致输出不一致。如果使用HashTable,则由于它是同步的,put在调用get之前完成。

有关更多详细信息,请参见this线程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接