標籤: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"); }
答案
- 2
- 2、2、3
- 2
原因
list作為入參,傳的其實是引用。那進入方法裡修改的也是該引用。
要解決這個問題,有兩個方法。一個是使用clone,一個是new一個新的對象1。然後把修改後的list作為出參return回去,這樣才不影響入參。
需要注意的是List和Map都是介面,是沒有clone的。ArrayList和HashMap才有clone,而且是淺拷貝,而不是深拷貝2。
ps:以前對Map爛熟,現在啥都不記得了。兩年沒怎麼寫Java,就連&和&&該用哪個都不知道了:
永遠不要離代碼太遠。不然,你離技術也越來越遠了。
轉載請標明出處:
本文出自:【ouyida3的部落格】
2015.7.12
- 傳值與傳址參考:
http://www.blogjava.net/junglesong/archive/2008/02/22/181246.html ?
- 深複製與淺複製網上大把的資料:
http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html ?
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java的List和Map作為入參與clone