小弟刚进公司,公司内模板涉及到集合拷贝部分用了以下方法实现
public static Object clone(Object o1) {
if (o1 == null) {
return null;
}
Object o2;
try {
if (o1 instanceof Number) {
return o1;
}
if (o1 instanceof String) {
return o1;
} return BeanUtils.cloneBean(o1);
} catch (Exception e) {
throw new RuntimeException(e);
}
} public static void copyCollection(List srcList, List objList) {
try {
for (int i = 0; i < srcList.size(); i++) {
Object o = srcList.get(i);
objList.add(clone(o));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
这里我有点不解,如果但是集合拷贝,为何不用
public static void copyCollection(List srcList, List objList){
if(null!=srcList){
objList.addAll(srcList);
}
}
}
这样明显效率可以高不少

解决方案 »

  1.   

    objList.add(clone(o));  区别在这。
      

  2.   

    package com.xuz.csdn.worldcup.day8;import java.util.ArrayList;
    import java.util.List;public class AddAllTest { public static void main(String[] args) {
    List<Object> list = new ArrayList<Object>();
    list.add("1");
    list.add(null);
    List<Object> list2 = new ArrayList<Object>();
    list.add("2");
    list2.add(null);
    list.addAll(list2);
    System.out.println(list);
    list.remove(3);
    System.out.println(list);
    System.out.println(list2);
    }
    }
    list.remove(3)后,list2也变了。这就是不clone的后果。
      

  3.   


    sorry,写错了一行。不是这个结果,我再看看!抱歉抱歉!!
      

  4.   

     objList.addAll(srcList);其实是吧srcList中各个ITEM的引用加入到objList集合,如果ITEM对应的不是基本类型,那么就有问题了,两个LIST的引用指向了相同的对象,所以当srcList引用的对象发生变化,会引起objList引用的对象也变化(其实就是同一个对象)那么就要使用objList.add(clone(o));克隆出一个新的对象,objList中元素引用新的对象,这样才是真正的拷贝。
      

  5.   


    import java.util.*;
    class Person{
       public String name;
       public void setName(String name){
           this.name=name;
       }
       public Person(String name){
           this.name=name;
       }
       public String toString(){
           return name;
       }
    }
    public class ColTest{
      public static void main(String args[]){
          Person p1=new Person("hello");
          Person p2=new Person("world");
          List<Person> l1=new ArrayList<Person>();
          l1.add(p1);l1.add(p2);
          List<Person> l2=new ArrayList<Person>();
          copyCollection(l1, l2); 
          System.out.println(l2);
          l1.get(0).setName("p1");//这里修改了l1的内容,结果l2也跟着变了!!!!!!!
          System.out.println(l2);
      }
     
      public static void copyCollection(List srcList, List objList){
            if(null!=srcList){
                objList.addAll(srcList);
            }
      }
    }
      

  6.   

    package com.xuz.csdn.worldcup.day8;import java.util.ArrayList;
    import java.util.List;public class AddAllTest { public static void main(String[] args) {
    List<MyClass> list = new ArrayList<MyClass>();
    list.add(new MyClass(1));
    list.add(new MyClass(2));
    list.add(new MyClass(3));
    List<MyClass> list2 = new ArrayList<MyClass>();
    list2.add(new MyClass(4));
    list2.add(new MyClass(5));
    list2.add(new MyClass(6));

    System.out.println(list);
    System.out.println(list2);

    list.addAll(list2);

    System.out.println(list);
    System.out.println(list2);

    MyClass myClass = list.get(list.size()-1);
    myClass.setI(999);

    System.out.println(list);
    System.out.println(list2);
    }
    }class MyClass {
    int i; public MyClass(int i) {
    this.i = i;
    } public String toString() {
    return i + "";
    }

    public void setI(int i){
    this.i = i;
    }
    }
    看看这个。