是否可以为HashMap集创建一个队列?

Dav*_*amp 10 java queue collections hashmap data-structures

现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希值.然后将每个组合及其哈希放入HashMap<String,String>.现在在我的消费者线程中,我希望能够Queue<>在hashmap上使用集合,这样我的消费者线程就可以调用poll()etc,从而删除atc,Queue但仍然让我能够在调用时看到组合及其哈希poll()我将如何去关于这样做?我有HashMap但不知道如何'制作'或将其作为队列投射.谢谢.

bla*_*lle 9

如果不处理代码的线程安全性,则不应使用HashMap.否则,您可能会以Live-lock结束.

为了能够使用插入键的顺序迭代Map,可以使用LinkedHashMap.

Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Run Code Online (Sandbox Code Playgroud)

制作人会像这样推送条目(没什么特别的):

m.put(key, object)
Run Code Online (Sandbox Code Playgroud)

消费者会像这样轮询条目:

while (someCondition) {
    Map.Entry nextEntry = null;

    // This block is equivalent to polling
    {
         synchronized(s) {
             Iterator i = s.iterator(); // Must be in the synchronized block
             if (i.hasNext()) {
                 nextEntry  = i.next();
                 i.remove();
             }
         }
    }

    if (nextEntry != null) {
         // Process the entry
         ...
    } else {
         // Sleep for some time
         ...
    }
    // process
}
Run Code Online (Sandbox Code Playgroud)


tem*_*def 6

LinkedHashMap类型是等的组合HashMap和一个Queue-它存储密钥/值对,还记得在它们被插入的顺序.这可能正是您正在寻找的类型.没有显式poll()函数,但如果你得到一个迭代器,LinkedHashMap你将按照它们的添加顺序访问元素.你可能会编写一个这样的函数:

public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
    assert !map.isEmpty();
    return map.iterator().next();
}
Run Code Online (Sandbox Code Playgroud)

这会让你回到第一个元素.只需确保正确同步.

或者,您可以考虑Queue通过定义辅助类Pair然后将Pairs 存储在队列中来存储键/值对.

希望这可以帮助!