List.add(Map)重溫java參數傳遞

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將對象當參數傳遞是傳遞的是內存地址-_-||

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章