我正在尝试简单的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())
但输出是相同的
答案 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