我的ArrayList正在覆盖以前的数据

时间:2015-01-09 17:34:51

标签: java arraylist

我正在尝试简单的ArrayList示例来解决我的其他代码的一些问题,但这个简单的代码提供了错误的输出。

我创建了一个Hashmap的Arraylist,在该Hashmap中放入3个键/值对,然后将该Hashmap放在ArrayList中,就像这样,

public class SortData {

    public static void main (String [] args){

    ArrayList<HashMap<String, String>> myArrayList = new ArrayList<HashMap<String,String>>();

    HashMap<String, String> myHashMap = new HashMap<String, String>();


        myHashMap.put("title",  "first Title");
        myHashMap.put("date",   "This is date");
        myHashMap.put("number", "5");

        myArrayList.add(0, myHashMap);

但是当我尝试在数组列表中添加更多数据时,

import java.util.ArrayList;
import java.util.HashMap;

public class SortData {

    public static void main (String [] args){

    ArrayList<HashMap<String, String>> myArrayList = new ArrayList<HashMap<String,String>>();

    HashMap<String, String> myHashMap = new HashMap<String, String>();


        myHashMap.put("title",  "first Title");
        myHashMap.put("date",   "This is date");
        myHashMap.put("number", "5");

        myArrayList.add(0, myHashMap);


        myHashMap.put("title",  "Second Title");
        myHashMap.put("date",   "This is 2nd date");
        myHashMap.put("number", "2");

        myArrayList.add(1, myHashMap);

        myHashMap.put("title",  "Third Title");
        myHashMap.put("date",   "This is 3rd date");
        myHashMap.put("number", "7");

        myArrayList.add(2, myHashMap);


        System.out.println(myArrayList.get(0)+"");
        System.out.println(myArrayList.get(1)+"");
        System.out.println(myArrayList.get(2)+"");


    }


}

输出是,

{title=Third Title, number=7, date=This is 3rd date}
{title=Third Title, number=7, date=This is 3rd date}
{title=Third Title, number=7, date=This is 3rd date}

为什么ArrayList中的先前值会被覆盖? 我试过了两个,

myArrayList.add(Hashmap())myArrayList.add(int index, Hashmap()) 但输出是相同的

1 个答案:

答案 0 :(得分:6)

ArrayList添加了对您添加的HashMap的引用,而不是副本。您已将HashMap添加到ArrayList 3次。每次添加后,您都会使用更多put次调用更改内容,因为相同的密钥会覆盖预先存在的值。

myArrayList[ o , o , o ]
             |   |   |
             +---+   |
             |       |
             +-------+
             |
             v
             myHashMap

要添加不同的内容,请每次添加不同的HashMap,方法是运行

myHashMap = new HashMap<String, String>();

在前2 add之后。

myArrayList[ o , o , o ]
             |   |   +-> HashMap
             |   |   
             |   +-----> HashMap
             |
             +---------> HashMap