Java的List和Map作為入參與clone

來源:互聯網
上載者:User

標籤:clone   java   

代碼
    public static void main(String[] args) {        testList();    }    /**     * 測試HashMap是否需要clone     *      * 1、你覺得,print出來的id是1還是2呢?      * 2、list的size是1還是2呢?每一個的map的id是1還是2?      * 3、id會不會是4呢?     *      * @since 2015.7.12     */    private static void testList() {        List<Map<String, String>> list = new ArrayList<Map<String, String>>();        Map<String, String> map = new HashMap<String, String>();        map.put("id", "1");        list.add(map);        testMap(list);        System.out.println("1、=========== id=" + list.get(0).get("id"));        testMap2(list);        System.out.println("2、=========== size=" + list.size());        System.out.println("id="+list.get(0).get("id"));        System.out.println("id="+list.get(1).get("id"));        testMap3(list);        System.out.println("3、=========== id=" + list.get(0).get("id"));    }    private static void testMap(List<Map<String, String>> list) {        Map<String, String> map = list.get(0);        map.put("id", "2");    }    private static void testMap2(List<Map<String, String>> list) {        Map<String, String> map = list.get(0);        map = new HashMap<String, String>();        map.put("id", "3");        list.add(map);    }    private static void testMap3(List<Map<String, String>> list) {        Map<String, String> map = (Map<String, String>) ((HashMap<String, String>) list.get(0)).clone();        map.put("id", "4");    }
答案
  1. 2
  2. 2、2、3
  3. 2
原因

list作為入參,傳的其實是引用。那進入方法裡修改的也是該引用。
要解決這個問題,有兩個方法。一個是使用clone,一個是new一個新的對象1。然後把修改後的list作為出參return回去,這樣才不影響入參。
需要注意的是List和Map都是介面,是沒有clone的。ArrayList和HashMap才有clone,而且是淺拷貝,而不是深拷貝2。

ps:以前對Map爛熟,現在啥都不記得了。兩年沒怎麼寫Java,就連&和&&該用哪個都不知道了:

永遠不要離代碼太遠。不然,你離技術也越來越遠了。

轉載請標明出處:
本文出自:【ouyida3的部落格】
2015.7.12

  1. 傳值與傳址參考:
    http://www.blogjava.net/junglesong/archive/2008/02/22/181246.html ?
  2. 深複製與淺複製網上大把的資料:
    http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html ?

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java的List和Map作為入參與clone

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.