1.情景描述
//test1
public static void main(String[] args){
List<HashMap<String,Object>> list = new ArrayList<HashMap<String, Object>>();
for(int i=0;i<5;i++){
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("aa","第"+i+"個");
list.add(map);
map.clear();
}
System.out.println(list.toString());
}
運行結果如下:
//test2
public static void main(String[] args){
List<HashMap<String,Object>> list = new ArrayList<HashMap<String, Object>>();
for(int i=0;i<5;i++){
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("aa","第"+i+"個");
list.add(map);
// map.clear();
}
System.out.println(list.toString());
}
運行結果如下:
2.發現問題
問題來了,爲什麼先add進了list,再clear,卻可以改變list內的值呢?
3.原因
因爲java在傳值時,若該值是引用數據類型,傳遞的是該對象的地址,即假設在for裏定義了map之後,在內存中爲其分配內存地址爲@1a,之後將若再操作map,如map.clear(),即該地址指向的對象被清空,所以list內的map地址指向的也就爲clear後的map,所以爲空。
4.後記
關於對象的傳遞,如以下demo:
//test3
public static void main(String[] args){
StringBuilder sb = new StringBuilder("hello");
System.out.println("改變前的sb:"+sb);
change(sb);
System.out.println("改變後的sb:"+sb);
}
public static void change(StringBuilder sb1){
// sb1 = new StringBuilder("O_O");
sb1.append("Wrold");
}
輸出如下:
//test4
public static void main(String[] args){
StringBuilder sb = new StringBuilder("hello");
System.out.println("改變前的sb:"+sb);
change(sb);
System.out.println("改變後的sb:"+sb);
}
public static void change(StringBuilder sb1){
sb1 = new StringBuilder("O_O");
sb1.append("Wrold");
}
輸出如下:
因爲在test4中,new 了一個新的StringBuilder,所以之後的append是操作新的對象。
證明以下java將對象當參數傳遞是傳遞的是內存地址-_-||