3

可能重复:
java中HashMap的克隆实用程序

我有一张一对一的地图:

      HashMap<Integer, ArrayList<Double>> matrix;

整数是索引,ArrayList 的维度约为 50。索引的大小可能高达一百万。我想尽快复制它(包括 Arraylist 值)。

我做了以下工作:

 public Map<Integer,ArrayList<Double>> getCloneOfMatrix(){
 Map<Integer, ArrayList<Double>> newMatrix = new HashMap<Integer,ArrayList<Double>>(); 
    for(int i=0 ; i < indexSize; i++){
        ArrayList<Double> arrList = new ArrayList<Double>();
        arrList=(ArrayList<Double>) matrix.get(i).clone();
        newMatrix.put(i,arrList);

    }           
    return   newMatrix;
}

我发现它的计算成本很高,有什么方法可以更快地做到这一点。

4

5 回答 5

4

最快的方法是避免一开始就需要制作副本。

如果您使用写时复制方法,您可以有两个对同一结构的引用,但都不会看到其他的变化。这避免了复制所有内容的需要,并且根据您的使用情况,避免了复制任何内容的需要。

于 2012-07-18T11:48:24.897 回答
3

Map.get()在每次迭代中都使用它,它会依次调用一个hashCode()函数,该函数可能是微不足道的,也可能不是微不足道的,然后在地图数据库中进行搜索。

您可以简单地迭代Entry保存在 中的集合,Map它将大大减少消耗的总时间(鉴于ArrayList相对较小)。

for(Entry<Integer,ArrayList<Double> entry : matrix.entrySet()) {
        //get the key using entry.getKey()
        //get the value (the ArrayList) using entry.getValue()
}     

此外,您可能需要考虑使用库来处理数学矩阵例如, Colt提供了密集矩阵和稀疏矩阵的实现,并且它已经为您实现和测试。

于 2012-07-18T11:50:12.563 回答
0

可能通过序列化克隆会有所帮助。

于 2012-07-18T11:47:43.017 回答
0

尽管它在复杂性方面无济于事,但ArrayList<Double>Java 中的 an 需要对每个元素进行装箱,而 - 因为它似乎是一个稀疏矩阵,所以第二维是固定的 - 使用它double[]会降低单位成本。

除此之外,使用经典的稀疏矩阵表示之一(假设它是稀疏的,或者您不会打扰哈希图)。

于 2012-07-18T11:48:20.997 回答
0

正如这个问题的答案所述,您应该尝试使用序列化/反序列化进行克隆。

于 2012-07-18T11:49:39.327 回答