有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java HashMap将一个新值附加到向量的优化方法,该向量是HashMap<String,vector<String>>中的值

类似于在C++中添加新元素到向量的类似方法:-

myHashMap[myKey].push_back(newElement); //push newElement to the value vector directly

在Java中,我能想到的唯一方法是从hashmap中获取向量。将新字符串附加到向量,然后使用新向量再次设置键

myValue = myHashMap.get(myKey);
/**Check if the key exists

**/
//If exists
myValue.add(newElement);
myHashmap.put(myKey, myValue);

第二种方法是否与前一种方法一样快?如果没有,是否还有其他方法?谢谢


共 (3) 个答案

  1. # 1 楼答案

    首先,如果您关心Java中的性能,请使用ArrayList而不是Vector。正如javadoc所说:

    As of the Java 2 platform v1.2, [Vector] was retrofitted to implement the List interface, making it a member of the Java Collections Framework. Unlike the new collection implementations, Vector is synchronized. If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector.

    所以,假设我们使用java 8(和^ {CD1>}),C++代码有两种翻译。p>

    版本#1。适用于Java 5+

    HashMap<String, ArrayList<String>> myMap = new HashMap<>();
    ...
    ArrayList<String> list = myMap.get(myKey);
    if (list == null) {
        list = new ArrayList<>();
        myMap.put(myKey, list);
    } 
    list.add(newElement);
    

    版本#2。适用于Java 8+

    HashMap<String, ArrayList<String>> myMap = new HashMap<>();
    ...
    myMap.computeIfAbsent(key, k -> ArrayList<>()).add(newElement);
    

    哪个更快?您需要测试它才能确定,但我认为第二个版本应该更快一些,因为它避免了put调用中的第二个hashmap查找

    1行代码比6行代码整齐。(YMMV的可读性。这取决于阅读代码的人,以及他们对Java 8+语言功能和API的熟悉程度。)

  2. # 2 楼答案

    在java中也可以用同样的方法来实现。 myHashMap.get(key).add(newValue) 因为在hashmap中,列表的引用(或者你可以说它是向量)存储为值。因此,修改列表的内容不会影响引用。您可以想象这个引用类似于C++中的向量的64位地址。p>

  3. # 3 楼答案

    不必将向量放回地图中,因为添加到地图中时已经在修改向量

    myHashMap[myKey].push_back(newElement); 
    

    是通过

    myHashMap.get(myKey)
         .add(newElement);
    

    (假设myHashMap.get(myKey)不返回null


    可以在Map界面中使用computeIfAbsent为第一次处理的密钥构造向量对象。这更优雅,不需要if

    myHashMap.computeIfAbsent(key, k -> new Vector<>())
                .add(newElement);
    

    函数(k -> new Vector<>())仅在myHashMap没有键key的映射时执行。它的好处是返回key的向量值,这样我们就可以对add调用进行链接