如何使用HashMap

时间:2016-12-10 05:40:27

标签: java linked-list hashmap iterator

在Java中,有没有办法从LinkedList集合中获取一个元素 如果我可以存储元素插入列表的位置,在恒定时间?我无法使用ArrayList,因为我想在常量时间从列表中间删除项目。

LinkedList' s get接受int作为参数,复杂度为O(N)。

在C ++中,我可以使用map来存储列表的迭代器。要在常量时间访问任何元素,我可以在哈希表中查找元素并获取迭代器。使用迭代器我可以到列表中的那个条目。

  1. 如何在Java中实现类似的功能?
  2. 我们可以将迭代器存储在HashMap的值中并使用它来直接访问元素吗?
  3. 这是一段代码片段,展示了如何在C ++中完成它。该程序不需要LinkedList和HashMap。但想象一下像LRU Cache或者我想要维护列表和地图的不同场景。

    list<string> namesList;
    unordered_map<string, list<string>::iterator> namesMap;
    
    namesList.push_front("hello");
    namesMap["hello"] = namesList.begin();
    
    namesList.push_front("hi");
    namesMap["hi"] = namesList.begin();
    
    namesList.push_front("abc");
    namesMap["abc"] = namesList.begin();
    
    // Now to access "hi" on the list, I can just look it up on the map
    // Get iterator to "hi" from the map and access it
    auto itr = namesMap.find("hi");
    if (itr != namesMap.end())
    {
        // This is a simple case where my list is just storing the key
        cout << *(itr->second) << endl;
    }
    

2 个答案:

答案 0 :(得分:3)

java.util.LinkedHashMap听起来就像你想要的那样(包括LRU案例)。对于更精细的缓存情况,您可能需要来自Guava库的com.google.common.cache.Cache

没有办法存储指向Java LinkedList中特定节点的指针,实际上LinkedList是一个相当无用的实现 - 即使编写它的Josh Bloch也不推荐它了。如果您的需求比LinkedListLinkedHashMap可以处理的更专业,那么您应该只构建自己的链表实现 - 它实际上是最简单的数据结构。

答案 1 :(得分:0)

Hashmap总是能够更好地查找元素而不是List。 这是数据结构本身的限制。

在Java中,您可以实现Hashmap以在恒定时间获取任何元素。 但是在List中搜索List中元素的最佳算法(排序列表) 是一个二进制搜索,花费O(log n)。