1. 程式人生 > >java中list的clear()問題

java中list的clear()問題

將list集合呼叫clear()方法,將list放入map中,再重新給list賦值。然後再將新的list放入map中,發現map中的兩個list一樣?

例子程式碼一:用list.clear()方法清空list

@Test
    public void test(){
        Map<String,List<String>> testMap = new HashMap<String, List<String>>();
        List<String> aLst = new ArrayList<String>();
aLst.add("1"); aLst.add("2"); testMap.put("a", aLst); //此時map中的元素 key為a ,value為[1,2] System.out.println("原來的aLst " + aLst); System.out.println("原來的map " + testMap); aLst.clear(); System.out.println("clear後的aLst " + aLst); aLst.add("3");
aLst.add("4"); aLst.add("5"); testMap.put("b", aLst); //此時map中的元素 key為a ,value為[1,2] System.out.println("後來的aLst " + aLst); System.out.println("後來的map " + testMap); }

輸出結果

原來的aLst [1, 2]
原來的map {a=[1, 2]}
clear後的aLst []
後來的aLst [3, 4, 5]
後來的map {b=[3, 4, 5], a=[3, 4, 5]}

例子程式碼2:list = null來清空list

@Test
    public void test2(){
        Map<String,List<String>> testMap = new HashMap<String, List<String>>();
        List<String> aLst = new ArrayList<String>();
        aLst.add("1");
        aLst.add("2");
        testMap.put("a", aLst); //此時map中的元素 key為a ,value為[1,2]
        System.out.println("原來的aLst " + aLst);
        System.out.println("原來的map " + testMap);
        aLst = null;
        System.out.println("clear後的aLst " +  aLst);
        aLst.add("3");
        aLst.add("4");
        aLst.add("5");
        testMap.put("b", aLst); //此時map中的元素 key為a ,value為[1,2]
        System.out.println("後來的aLst " + aLst);
        System.out.println("後來的map " + testMap);
    }

執行結果

原來的aLst [1, 2]
原來的map {a=[1, 2]}
clear後的aLst null

例子程式碼三:new ArrayList()來清空list

@Test
    public void test3(){
        Map<String,List<String>> testMap = new HashMap<String, List<String>>();
        List<String> aLst = new ArrayList<String>();
        aLst.add("1");
        aLst.add("2");
        testMap.put("a", aLst); //此時map中的元素 key為a ,value為[1,2]
        System.out.println("原來的aLst " + aLst);
        System.out.println("原來的map " + testMap);
        aLst = new ArrayList<String>();
        System.out.println("clear後的aLst " +  aLst);
        aLst.add("3");
        aLst.add("4");
        aLst.add("5");
        testMap.put("b", aLst); //此時map中的元素 key為a ,value為[1,2]
        System.out.println("後來的aLst " + aLst);
        System.out.println("後來的map " + testMap);
    }

執行結果

原來的aLst [1, 2]
原來的map {a=[1, 2]}
clear後的aLst []
後來的aLst [3, 4, 5]
後來的map {b=[3, 4, 5], a=[1, 2]}

結論(猜想):

map中的value值引用的是記憶體地址,所以當我們new了一個新的list時,map中新增的list和原來的list才會不同。而當我們執行list = null時,list.add()方法失效並報錯,猜想此時的list不再是List集合.