日期:2014-05-20  浏览次数:20572 次

Map一个小问题

    Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    map.put(1, list);
    list = new ArrayList<Integer>(); //list.clear();

今天遇到的,如果把list = new ArrayList<Integer>();换成list.clear()不仅会清空LIST的值,还会清空MAP中的LIST值,而list = new ArrayList<Integer>()就不会,请问为什么?

------解决方案--------------------
list.clear() 是清空list 内数据的意思
------解决方案--------------------


------解决方案--------------------
说白了,list.clear()是清空list对象中的值,而list=new ArrayList<Integer>()是将list变量指向新建的List对象,会覆盖list对象中的值,但不会清空已经入map里的list
------解决方案--------------------
楼主对java中的集合的引用理解不够,你map所put的那个list是指向第一个的ArrayList对象也就是map里面存的是这个对象的地址。list的引用也是指向这个ArrayList的,所以你用list.clear()等于清空了这个ArrayList的内容。那此时map在获取这个对象的时候里面自然是被清空了。你把list=new ArrayList();重新new一个ArrayList其实已经把list的引用指向另一个ArrayList的对象了但是map里面所放的仍然还是原来的ArrayList对象那个并没有改变所以里面的元素都在
------解决方案--------------------
引用:
楼主对java中的集合的引用理解不够,你map所put的那个list是指向第一个的ArrayList对象也就是map里面存的是这个对象的地址。list的引用也是指向这个ArrayList的,所以你用list.clear()等于清空了这个ArrayList的内容。那此时map在获取这个对象的时候里面自然是被清空了。你把list=new ArrayList();重新new一个ArrayList其实已经把list的引用指向另一个ArrayList的对象了但是map里面所放的仍然还是原来的ArrayList对象那个并没有改变所以里面的元素都在
+1
------解决方案--------------------
引用:
楼主对java中的集合的引用理解不够,你map所put的那个list是指向第一个的ArrayList对象也就是map里面存的是这个对象的地址。list的引用也是指向这个ArrayList的,所以你用list.clear()等于清空了这个ArrayList的内容。那此时map在获取这个对象的时候里面自然是被清空了。你把list=new ArrayList();重新new一个ArrayList其实已经把list的引用指向另一个ArrayList的对象了但是map里面所放的仍然还是原来的ArrayList对象那个并没有改变所以里面的元素都在
+1
------解决方案--------------------
引用:
楼主对java中的集合的引用理解不够,你map所put的那个list是指向第一个的ArrayList对象也就是map里面存的是这个对象的地址。list的引用也是指向这个ArrayList的,所以你用list.clear()等于清空了这个ArrayList的内容。那此时map在获取这个对象的时候里面自然是被清空了。你把list=new ArrayList();重新new一个ArrayList其实已经把list的引用指向另一个ArrayList的对象了但是map里面所放的仍然还是原来的ArrayList对象那个并没有改变所以里面的元素都在
很不错
------解决方案--------------------
引用:
Quote: 引用:

楼主对java中的集合的引用理解不够,你map所put的那个list是指向第一个的ArrayList对象也就是map里面存的是这个对象的地址。list的引用也是指向这个ArrayList的,所以你用list.clear()等于清空了这个ArrayList的内容。那此时map在获取这个对象的时候里面自然是被清空了。你把list=new ArrayList();重新new一个ArrayList其实已经把list的引用指向另一个ArrayList的对象了但是map里面所放的仍然还是原来的ArrayList对象那个并没有改变所以里面的元素都在
很不错

不错
------解决方案--------------------
就是内存的问题了,list.clear();删除了内存里面的数据。
------解决方案--------------------
...看看内存解析
------解决方案--------------------
list = new ArrayList<Integer>(); 这句话的意思是将引用变量list指向另外的地址,原来地址的里面的值并没有发生改变,而list.clear()是将原来地址里的值给clear 了
------解决方案--------------------
就是内存中存储的问题。对list第二次赋值的时候,注意,这个地方是对list引用的地址做了更改,指向了新的地址。原来的还在原来的地址上。clear方法调用的时候,是在原地址上操作,map引用这块地址存储一部分值也会被清空。
------解决方案--------------------
这个是对象指向问题 list指向新的ArrayList了 已经不再指向原来的对象