记录几种容器复制的方法(浅复制),下文会提出浅复制的问题
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进行了修改。
集合中元素的变化说明:上述“复制”没有复制集合中的元素,仅是复制了集合。