2d ArrayLists - 为什么将对象添加到一个子列表会将相同的对象添加到所有子列表?

时间:2013-03-06 21:45:11

标签: java collections arraylist

在Java中,我正在为一个包含4支球队的联赛创建一个足球赛具生成器。

我有一个名为'matchDays'的二维数组列表,其中包含6个匹配日数组列表。每个比赛日包含2个灯具对象。

我正在尝试迭代matchDays,并且对于每个比赛日,从我单独创建的所有可能灯具的列表中添加2个灯具对象。问题是当我添加一个灯具以匹配第1天时,它也会被添加到第2天到第6天。

以下代码来自我编写的测试用例,突出了我遇到的问题:

@Test
public void arrayListTest() {
    FixtureGenerator fixGen = new FixtureGenerator();

    // Generate all possible fixtures
    List<Fixture> fixtures = fixGen.generateFixtures();

    // Create list of all 4 participating teams
    List<Club> clubs = fixGen.createListOfClubs();

    // Create 6 lists (match days) to store 2 fixtures in each
    List<List<Fixture>> matchDays = fixGen.createMatchDaysList(clubs); 

    matchDays.get(0).add(fixtures.get(0));
    System.out.println("Match day 1, fixture 1: " + matchDays.get(0).get(0).getHomeTeam() + 
            " v " + matchDays.get(0).get(0).getAwayTeam());
    System.out.println("Match day 2, fixture 1: " + matchDays.get(1).get(0).getHomeTeam() + 
            " v " + matchDays.get(1).get(0).getAwayTeam());
    System.out.println("Match day 3, fixture 1: " + matchDays.get(2).get(0).getHomeTeam() + 
            " v " + matchDays.get(2).get(0).getAwayTeam());
}

此代码生成以下控制台输出:

Match day 1, fixture 1: Team A v Team B
Match day 2, fixture 1: Team A v Team B
Match day 3, fixture 1: Team A v Team B

如果我只添加了'Team A v Team B'以匹配第1天,那么它是如何在比赛第2天和第3天出现的?

2 个答案:

答案 0 :(得分:0)

来自Javadoc:“返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。”

答案 1 :(得分:0)

找到问题代码。我使用@LuiggiMendoza和@DaveNewton所述的相同引用填充matchDays列表,如下所示:

List<List<Fixture>> matchdays = new ArrayList<List<Fixture>>();
List<Fixture> matchday = new ArrayList<Fixture>();
for (int i = 0; i < noOfMatchDays; i++) {
    matchdays.add(matchday);
}

我所要做的只是将其更改为以下内容,以便每个匹配日由其自己的列表对象表示:

List<List<Fixture>> matchdays = new ArrayList<List<Fixture>>();

for(int i = 0; i < noOfMatchDays; i++){
    matchdays.add(new ArrayList<Fixture>());
}

感谢大家的答案:)