ArrayList的复制(浅复制)

记录几种容器复制的方法(浅复制),下文会提出浅复制的问题

 

package com.sg;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * <b>ShallowCopy.java</b>
 * @author yanlei
 * @version 1.0 Jun 1, 2012
 */
public class ShallowCopy {

    
    public static void main(String[] args) {
        User user1 = new User("user1");
        User user2 = new User("user2");
        User user3 = new User("user3");
        List<User> src = new ArrayList<User>();
        src.add(user1);
        src.add(user2);
        src.add(user3);
        
        System.out.println("* newListCopy  begin ********");
        // 调用方法并输出
        printList(newListCopy(src));
        System.out.println("* newListCopy  end **********");
        
        System.out.println("* addAllCopy  begin *********");
        // 调用方法并输出
        printList(addAllCopy(src));
        System.out.println("* addAllCopy  end ***********");
        
        System.out.println("* collectionsCopy  begin ****");
        // 调用方法并输出
        printList(collectionsCopy(src));
        System.out.println("* collectionsCopy  end ******");
        
        System.out.println("* iteratorCopy  begin *******");
        // 调用方法并输出
        printList(iteratorCopy(src));
        System.out.println("* iteratorCopy  end *********");
    }

    // 使用构造方法copy
    public static List<User> newListCopy(List<User> src) {
        // 不同容器的构造方方法实现不尽相同
        List<User> dest = new ArrayList<User>(src);
        return dest;
    }
    
    // 使用addAll方法
    public static List<User> addAllCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 不同容器的实现方式不尽相同
        dest.addAll(src);
        return dest;
    }
    
    // 使用Collections.copy(List<? super T> dest, List<? extends T> src)方法
    public static List<User> collectionsCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 如果目标容器的size小于原始容器sizes,copy方法会抛出异常,因此需要初始化目标容器size
        // sp:ArrayList(int initialCapacity)构造方法可以初始化容器数组大小,但是不能修改size
        for(int i = 0; i < src.size(); i++) {
            dest.add((User)null);
        }
        
        Collections.copy(dest, src);
        return dest;
    }
    
    // 遍历复制
    public static List<User> iteratorCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 不进行非空判断,视src不为null
        for(User user : src) {
            dest.add(user);
        }
        return dest;
    }
    
    // 输出容器中的user信息
    public static void printList(List<User> userList){
        for(User user : userList) {
            System.out.println("use name is" +user.getName());
        }
    }
}

class User{
    
    public User(){}
    
    public User(String name) {
        this.name = name;
    }
    
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

输出结果:

 

* newListCopy  begin ********
use name isuser1
use name isuser2
use name isuser3
* newListCopy  end **********
* addAllCopy  begin *********
use name isuser1
use name isuser2
use name isuser3
* addAllCopy  end ***********
* collectionsCopy  begin ****
use name isuser1
use name isuser2
use name isuser3
* collectionsCopy  end ******
* iteratorCopy  begin *******
use name isuser1
use name isuser2
use name isuser3
* iteratorCopy  end *********

 

 

浅复制的问题——容器中对象复制了吗?

在原有的代码中修改一下

 

package com.sg;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * <b>ShallowCopy.java</b>
 * @author yanlei
 * @version 1.0 Jun 1, 2012
 */
public class CopyOfShallowCopyProblem {

    
    public static void main(String[] args) {
        User user1 = new User("user1");
        User user2 = new User("user2");
        User user3 = new User("user3");
        List<User> src = new ArrayList<User>();
        src.add(user1);
        src.add(user2);
        src.add(user3);
        
        System.out.println("* newListCopy  begin ********");
        printList(newListCopy(src));
        System.out.println("* newListCopy  end **********");
        
        System.out.println("* addAllCopy  begin *********");
        printList(addAllCopy(src));
        System.out.println("* addAllCopy  end ***********");
        
        System.out.println("* collectionsCopy  begin ****");
        printList(collectionsCopy(src));
        System.out.println("* collectionsCopy  end ******");
        
        System.out.println("* iteratorCopy  begin *******");
        printList(iteratorCopy(src));
        System.out.println("* iteratorCopy  end *********");
        
        // 修改一下user3
        user3.setName("newUserName");
        
        // 重新输出
        System.out.println("* newListCopy  begin ********");
        printList(newListCopy(src));
        System.out.println("* newListCopy  end **********");
        
        System.out.println("* addAllCopy  begin *********");
        printList(addAllCopy(src));
        System.out.println("* addAllCopy  end ***********");
        
        System.out.println("* collectionsCopy  begin ****");
        printList(collectionsCopy(src));
        System.out.println("* collectionsCopy  end ******");
        
        System.out.println("* iteratorCopy  begin *******");
        printList(iteratorCopy(src));
        System.out.println("* iteratorCopy  end *********");
    }

    // 使用构造方法copy
    public static List<User> newListCopy(List<User> src) {
        // 不同容器的构造方方法实现不尽相同
        List<User> dest = new ArrayList<User>(src);
        return dest;
    }
    
    // 使用addAll方法
    public static List<User> addAllCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 不同容器的实现方式不尽相同
        dest.addAll(src);
        return dest;
    }
    
    // 使用Collections.copy(List<? super T> dest, List<? extends T> src)方法
    public static List<User> collectionsCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 如果目标容器的size小于原始容器sizes,copy方法会抛出异常,因此需要初始化目标容器size
        // sp:ArrayList(int initialCapacity)构造方法可以初始化容器数组大小,但是不能修改size
        for(int i = 0; i < src.size(); i++) {
            dest.add((User)null);
        }
        
        Collections.copy(dest, src);
        return dest;
    }
    
    // 遍历复制
    public static List<User> iteratorCopy(List<User> src) {
        List<User> dest = new ArrayList<User>();
        // 不进行非空判断,视src不为null
        for(User user : src) {
            dest.add(user);
        }
        return dest;
    }
    
    // 输出容器中的user信息
    public static void printList(List<User> userList){
        for(User user : userList) {
            System.out.println("use name is" +user.getName());
        }
    }
}

 

输出结果

 

* newListCopy  begin ********
use name isuser1
use name isuser2
use name isuser3
* newListCopy  end **********
* addAllCopy  begin *********
use name isuser1
use name isuser2
use name isuser3
* addAllCopy  end ***********
* collectionsCopy  begin ****
use name isuser1
use name isuser2
use name isuser3
* collectionsCopy  end ******
* iteratorCopy  begin *******
use name isuser1
use name isuser2
use name isuser3
* iteratorCopy  end *********
* newListCopy  begin ********
use name isuser1
use name isuser2
use name isnewUserName
* newListCopy  end **********
* addAllCopy  begin *********
use name isuser1
use name isuser2
use name isnewUserName
* addAllCopy  end ***********
* collectionsCopy  begin ****
use name isuser1
use name isuser2
use name isnewUserName
* collectionsCopy  end ******
* iteratorCopy  begin *******
use name isuser1
use name isuser2
use name isnewUserName
* iteratorCopy  end *********

 

从输出可以看到,我并没有修改“复制”后集合中的元素,仅是将原有的user3的name进行了修改。

集合中元素的变化说明:上述“复制”没有复制集合中的元素,仅是复制了集合。

你可能感兴趣的:(ArrayList)