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>()就不会,请问为什么?

解决方案 »

  1.   

    list.clear() 是清空list 内数据的意思
      

  2.   

    说白了,list.clear()是清空list对象中的值,而list=new ArrayList<Integer>()是将list变量指向新建的List对象,会覆盖list对象中的值,但不会清空已经入map里的list
      

  3.   

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

  4.   

    就是内存的问题了,list.clear();删除了内存里面的数据。
      

  5.   

    list = new ArrayList<Integer>(); 这句话的意思是将引用变量list指向另外的地址,原来地址的里面的值并没有发生改变,而list.clear()是将原来地址里的值给clear 了
      

  6.   

    就是内存中存储的问题。对list第二次赋值的时候,注意,这个地方是对list引用的地址做了更改,指向了新的地址。原来的还在原来的地址上。clear方法调用的时候,是在原地址上操作,map引用这块地址存储一部分值也会被清空。
      

  7.   

    这个是对象指向问题 list指向新的ArrayList了 已经不再指向原来的对象
      

  8.   

    唉,当时看马士兵视频的时候这部分就听的不怎么好,我以为list.clear清除的是指list对其地址的引用。多谢了