ArrayList list1 = new ArrayList();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");ArrayList list2 = new ArrayList();list2 = list1;//赋值一下
list1.clear();//清除第一个
System.out.println("list2 = " + list2);
我不明白的是,为什么第二个arraylist是new出来的,却还和第一个用一个地址。

解决方案 »

  1.   

    list2 = list1;//赋值一下 这有问题,赋的是地址啊。
      

  2.   


    或者这样吧,就可以解决了。
          list2.add(ctype(list(i),Integer))   
      

  3.   

    第二个是你new出来的,但是你做了这样一步就是赋值list2=list1这句话的意思是使原来指向第二个new的ArrayList指向了第一个new出来的ArrayList,所以他们就指向了同一个地址
       ------        ------
      |list1 |----> | A1   |   A1是第一个new出来的ArrayList
      |list2 |----> | A2   |   A2是第二个new出来的ArrayList
      | (栈) |      | (堆) |
       ------        ------
    然后list2 = list1
       ------         ------
      |list1 |---->  | A1   |   list2就指向了A1
      |list2 |/      | A2   |  
      | (栈) |       | (堆) |
       ------         ------
      

  4.   

    不明白?要清楚什么是变量,什么是对象ArrayList list2 = new ArrayList(); 
    声明了一个ArrayList的引用变量list2,并将从new返回的那个对象的地址覆给了list2
    list2 = list1;
    又将list1的值覆给了list2,这时list1与list2的值是一样的,都是第一个new出来的ArrayList的地址
    通俗一点就list1与list2指向了同一个对象
    改变list1指向的对象,就是改变list2指向的对象
      

  5.   

    其实还有更简单的方法。list2的构造直接传List1也可以啊。
      

  6.   

    list2 = list1;//赋值一下 
    list2重新指向了一个地址了~~~
      

  7.   

    list2 = list1;//赋值一下 在java中,对象的赋值是传地址的,不是传内容。
      

  8.   

    呵呵 可以去看下  尚学堂马士兵的JAVA视频  有教你如何分析内存分配   
      

  9.   

    可以用clone方法复制吧,不过clone出的ArrayList的元素并没有被clone
      

  10.   

    new 一个类都是保存在堆中的,而且你赋值是把new ArrayList()的地址赋值给了变量。相当于了C中指针。
    所以list2清空相当于把堆地址中数据都清空了。list1和list2共享的一个对地址,有不清楚。