【问题标题】:difference between hashmap and hashtable| [duplicate]hashmap和hashtable的区别| [复制]
【发布时间】:2012-01-14 16:41:54
【问题描述】:

可能重复:
Differences between HashMap and 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,就永远不会并行执行2条语句

有人可以澄清一下,什么时候会有问题? 有什么情况的例子吗?

编辑:我通过交换 hashmap 和 hashtable 发布了这个问题。我知道 hashtable 方法是同步的,而 hashmap 的方法不是,我已经告诉他了

体验一下,我实现了以下。并且代码从未崩溃?我使用哈希表,但它仍然是 A 中的哈希图 :)

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();
    }
}

【问题讨论】:

  • 先生。 Pointy-Hair 可能认为 tb.put/tb.get 只包含一条 cpu 指令:)
  • 我不明白人们为什么要投赞成票。这与差异无关,我知道,给我一个情况
  • @Pointy 头发是谁? :) 面试官?

标签: java hashmap hashtable


【解决方案1】:

嗯,仅仅因为它是单核的,并不意味着你不能有竞争条件。这可能(可能?)意味着您不会遇到内存可见性问题,但您当然可以在单个内核上运行多个线程,并且仍然可以安排它们以获得竞争条件。

【讨论】:

    【解决方案2】:

    这里有个不错的链接,可以参考:Differences between HashMap and Hashtable?

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

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

    【讨论】:

      【解决方案3】:

      我认为在提问之前你必须先做以下事情:

      1. 在 stackoverflow 上搜索
      2. 在谷歌上搜索

      以上两种方法得到如下结果:

      StackOverflow: Differences between HashMap and Hashtable?

      谷歌

      what is the difference between HashMap and Hashtable

      Difference between HashMap and HashTable? Can we make hashmap synchronized?

      希望有帮助:)

      【讨论】:

      • @Jaomos:我知道 hashtable 的方法是同步的,而 map 的方法不是。举个例子,它会失败。不要太聪明。我也是 java 程序员,不是新手宝贝
      • 您没有说您知道原始帖子中的差异。所以,在你提出的问题上更加完整,你会得到更好的答案。
      【解决方案4】:

      与新的集合实现不同,Hashtable 是同步的。这就是为什么我可以想象使用HashMap 会产生问题的情况,而使用Hashtable 会解决它。

      它是单核这一事实无关紧要:如果Thread1put 调用过程中被抢占,Thread2 将看到不一致的状态,并可能崩溃。

      【讨论】:

      • 我告诉他同样的事情,一个操作的 put 不会在 get 另一个线程之前完成,但不愿意接受我的回答。
      • 面试是一个双向的过程。如果你说对了,而他说错了(在他选择的主题中,同样如此),这说明了他的一些事情。如果这是您要与之合作的人,则可能是一个警告标志。
      【解决方案5】:

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

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

      查看this线程了解更多详情

      【讨论】:

        猜你喜欢
        • 2020-10-11
        • 2010-11-15
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 2015-07-18
        • 2013-07-28
        相关资源
        最近更新 更多