我前一天接受采访时,面试官问我在哪种情况下会有问题使用hashmap而不是哈希表? 含义给出例如hashtmap使用会导致问题的地方,但使用散列表将解决问题。
他告诉我运行代码的机器是单核!!
我给了一个例如
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();
}
}
答案 0 :(得分: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?
希望有所帮助:)
答案 1 :(得分:2)
与新的集合实现不同,Hashtable是同步的。这就是为什么我可以想象使用Hashmap会产生问题的情况,并且使用Hashtable会解决它。
它是单核的事实并不重要:如果Thread1在put
调用的中间被抢占,Thread2将看到一个不一致的状态,并可能崩溃。
答案 2 :(得分:0)
嗯,仅仅因为它是单核心,并不意味着你不能拥有竞争条件。它可能(可能是?)意味着你不会遇到内存可见性问题,但是你当然可以在一个内核上运行多个线程,并且它们仍然可以被调度,以便你获得竞争条件。
答案 3 :(得分:0)
这是一个很好的链接,你可以参考:Differences between HashMap and Hashtable?
我想知道他们是否正如你所说的那样问你,因为他似乎想问哪个是线程安全的,哪个不是。
HashTable是线程安全的,但为什么他会问HashTable的问题?
答案 4 :(得分:0)
这里syncoronization是在这种情况下应该使用哈希表的主要原因。即使在这种情况下使用单个核心,您也无法保证tb.put("a",2)
将在tb.get("a")
被调用之前完成其执行。
这可能会导致输出不一致。如果使用HashTable,由于它是同步的,put
在调用get
之前完成。
有关详细信息,请参阅this主题
答案 5 :(得分:0)
你可以在这里清楚地找到差异......
http://javabynataraj.blogspot.com/2010/09/java-interview-questions-downlaod.html