簡體   English   中英

Collections.nCopies不創建列表的副本

[英]Collections.nCopies not creating copies of list

我創建了一個List ,其中包含默認大小集。 因此,我使用set方法將數據添加到列表中。

我的代碼:

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test2 {
public static void main(String args[]) {
    List<List<String>> keys = new ArrayList<>(Collections.nCopies(3, new ArrayList<>()));
    List<String> values = keys.get(2);
    values.add("Hello");
    values.add("One Two");
    keys.set(2, values);
    List<String> tempList = keys.get(1);
    tempList.add("Now adding at 1");
    keys.set(1, tempList);
    System.out.println("Position 1 " + keys.get(1).toString());
    System.out.println("Position 2 " + keys.get(2).toString());
}
}

我的輸出:

Position 1 [Hello, One Two, Now adding at 1]
Position 2 [Hello, One Two, Now adding at 1]

它為什么這樣做? 第一個數據也被附加到第二個數據上? 我究竟做錯了什么 ?

List<List<String>> keys = new ArrayList<>(Collections.nCopies(3, new ArrayList<>()))

在這個語句中,它沒有創建三個新的ArrayList<>實例。 它創建一個實例並創建一個列表,其中包含對同一實例的三個引用。 因此,列表列表中的每個位置都是對同一ArrayList實例的引用。

你可以做的最簡單的事情是使用for循環:

for(int i = 0; i < numCopies; i++) {
    keys.add(new ArrayList<>());
}

使用Java 8的流API的等效解決方案:

IntStream.range(0, n).mapToObj(ArrayList<String>::new).forEach(keys::add);

或者你可以像這樣一次創建keys

List<List<String>> keys = IntStream.range(0, numCopies)
                                   .mapToObj(ArrayList<String>::new)
                                   .collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM