记录几种容器复制的方法(浅复制),下文会提出浅复制的问题
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进行了修改。
集合中元素的变化说明:上述“复制”没有复制集合中的元素,仅是复制了集合。
分享到:
相关推荐
本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...
如果集合支持`copy()`方法(如`ArrayList`),也可以使用它进行复制。 - **使用工具类**:如Apache Commons Collections的`CollectionUtils.copy()`方法,可以实现集合的深拷贝。 5. **注解实现集合复制** - 在...
当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...
重写时,需要创建一个新的数组,并将ArrayList的所有元素复制到新数组中。 12. **Clone方法**:创建ArrayList的浅拷贝。这意味着新实例引用相同的元素,但不是新的元素副本。 13. **GetEnumerator方法**:返回一个...
而Cloneable接口则是为了支持对象的浅复制,即通过调用Object类的clone()方法可以创建ArrayList的一个浅拷贝。 ArrayList的内部结构是一个Object类型的数组。当添加新元素时,如果当前数组容量不足,ArrayList会...
浅拷贝仅复制数组本身,不复制其元素,而深拷贝则会复制整个对象包括嵌套的对象。对于基本类型数组,复制过程就是简单的内存复制;对于引用类型数组,浅拷贝仅复制引用,深拷贝会创建新的对象实例。 2. **System....
VB中的ArrayList或Generic.List等集合类也支持数组的复制。例如: ```vb Dim sourceArr(0 To 4) As Integer = {1, 2, 3, 4, 5} Dim destArr As New ArrayList() destArr.AddRange(sourceArr) destArr.ToArray() '...
- 但在某些场景下,特别是当数据量较大且增删操作位于列表尾部时,`ArrayList`的性能可能优于`LinkedList`,因为数组复制的速度通常快于链表遍历。 3. **内存占用**: - 通常情况下,`LinkedList`由于需要额外的...
4. **`Cloneable`**:表明该类支持浅克隆。 5. **`Serializable`**:使对象能够被序列化。 ### 二、重要字段 #### 1. `serialVersionUID` 序列化版本ID,用于序列化兼容性的控制。 ```java private static final...
这两个方法可以创建一个新的数组,并复制原始数组的部分或全部元素,实现浅拷贝。 3. **System.arraycopy()** `System.arraycopy()`是另一个高效的复制数组元素的方法。它允许在两个数组之间直接复制数据,无需...
ArrayList的克隆方法允许创建ArrayList的一个浅拷贝,其中包含相同的元素但不同的引用。这意味着原始ArrayList和克隆对象之间的元素仍然是共享的,如果元素是不可变的,这通常不是问题;但对于可变元素,改变克隆...
List<Integer> copiedList = new ArrayList(list); Integer[] copiedNumbers = copiedList.toArray(new Integer[0]); ``` 在实际编程中,选择哪种方法取决于具体需求,如是否需要深拷贝、效率要求、以及是否需要...
浅复制是通过`clone()`方法实现,仅复制对象的引用,而不复制对象内部的引用数据。深复制则需要通过序列化和反序列化或者自定义复制逻辑来完成,确保所有层次的对象都被复制。 对于数组的排序,Java提供了多种排序...
Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...
Java对象的复制主要有两种方式:浅复制(Shallow Copy)和深复制(Deep Copy)。标题中的"java对象复制"主要涉及到Java中对象复制的基本概念、实现方法以及相关的注意事项。 首先,Java中的对象复制问题源于其默认...
浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,那么新对象和原对象会共享这些引用。因此,对这些引用的修改会影响到两个对象。相反,深克隆不仅复制了...
这是一种浅拷贝的方式,新建一个相同长度的数组,然后将原数组中的元素逐个复制过去。 优点:简单易懂,易于实现。 缺点:效率较低,特别是在处理大型数组时。 方法二:使用数组对象中的 CopyTo() 方法 该方法使用...
在Java编程中,深拷贝和浅拷贝是两种常见的对象复制方式,它们涉及到对象的内存管理和内存层次的复制。本文将深入探讨这两个概念,并通过一个具体的示例——`CopyTest`来阐述它们的区别。 首先,浅拷贝(Shallow ...
浅克隆是将对象的引用类型成员变量复制过去,而深克隆是将对象的所有成员变量复制过去。 浅克隆的实现步骤: * 被复制的类需要实现Clonenable接口。 * 覆盖clone()方法,访问修饰符设为public。 * 方法中调用super...