`
winnie825
  • 浏览: 120452 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArrayList的复制(浅复制)

    博客分类:
  • java
 
阅读更多

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

 

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进行了修改。

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

分享到:
评论

相关推荐

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    java不同对象及集合的多次复制

    如果集合支持`copy()`方法(如`ArrayList`),也可以使用它进行复制。 - **使用工具类**:如Apache Commons Collections的`CollectionUtils.copy()`方法,可以实现集合的深拷贝。 5. **注解实现集合复制** - 在...

    java List 深度复制方法

    当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...

    c#重写ArrayList源代码

    重写时,需要创建一个新的数组,并将ArrayList的所有元素复制到新数组中。 12. **Clone方法**:创建ArrayList的浅拷贝。这意味着新实例引用相同的元素,但不是新的元素副本。 13. **GetEnumerator方法**:返回一个...

    ArrayList底层原理

    而Cloneable接口则是为了支持对象的浅复制,即通过调用Object类的clone()方法可以创建ArrayList的一个浅拷贝。 ArrayList的内部结构是一个Object类型的数组。当添加新元素时,如果当前数组容量不足,ArrayList会...

    java高端技术课程--Java数组如何实现复制

    浅拷贝仅复制数组本身,不复制其元素,而深拷贝则会复制整个对象包括嵌套的对象。对于基本类型数组,复制过程就是简单的内存复制;对于引用类型数组,浅拷贝仅复制引用,深拷贝会创建新的对象实例。 2. **System....

    VB 数组的复制实例

    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.docx

    - 但在某些场景下,特别是当数据量较大且增删操作位于列表尾部时,`ArrayList`的性能可能优于`LinkedList`,因为数组复制的速度通常快于链表遍历。 3. **内存占用**: - 通常情况下,`LinkedList`由于需要额外的...

    ArrayList底层.pdf

    4. **`Cloneable`**:表明该类支持浅克隆。 5. **`Serializable`**:使对象能够被序列化。 ### 二、重要字段 #### 1. `serialVersionUID` 序列化版本ID,用于序列化兼容性的控制。 ```java private static final...

    数据复制代码JAVA

    这两个方法可以创建一个新的数组,并复制原始数组的部分或全部元素,实现浅拷贝。 3. **System.arraycopy()** `System.arraycopy()`是另一个高效的复制数组元素的方法。它允许在两个数组之间直接复制数据,无需...

    List集合之ArrayList

    ArrayList的克隆方法允许创建ArrayList的一个浅拷贝,其中包含相同的元素但不同的引用。这意味着原始ArrayList和克隆对象之间的元素仍然是共享的,如果元素是不可变的,这通常不是问题;但对于可变元素,改变克隆...

    java 复制数组的资源

    List&lt;Integer&gt; copiedList = new ArrayList(list); Integer[] copiedNumbers = copiedList.toArray(new Integer[0]); ``` 在实际编程中,选择哪种方法取决于具体需求,如是否需要深拷贝、效率要求、以及是否需要...

    Java 的常用包与数组的复制与排序24

    浅复制是通过`clone()`方法实现,仅复制对象的引用,而不复制对象内部的引用数据。深复制则需要通过序列化和反序列化或者自定义复制逻辑来完成,确保所有层次的对象都被复制。 对于数组的排序,Java提供了多种排序...

    Java Clone深拷贝与浅拷贝的两种实现方法

    Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...

    java对象复制

    Java对象的复制主要有两种方式:浅复制(Shallow Copy)和深复制(Deep Copy)。标题中的"java对象复制"主要涉及到Java中对象复制的基本概念、实现方法以及相关的注意事项。 首先,Java中的对象复制问题源于其默认...

    java 对象克隆

    浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,那么新对象和原对象会共享这些引用。因此,对这些引用的修改会影响到两个对象。相反,深克隆不仅复制了...

    C# 拷贝数组的几种方式.

    这是一种浅拷贝的方式,新建一个相同长度的数组,然后将原数组中的元素逐个复制过去。 优点:简单易懂,易于实现。 缺点:效率较低,特别是在处理大型数组时。 方法二:使用数组对象中的 CopyTo() 方法 该方法使用...

    关于java中的深copy与浅copy的问题

    在Java编程中,深拷贝和浅拷贝是两种常见的对象复制方式,它们涉及到对象的内存管理和内存层次的复制。本文将深入探讨这两个概念,并通过一个具体的示例——`CopyTest`来阐述它们的区别。 首先,浅拷贝(Shallow ...

    Java对象的复制三种方式(小结)

    浅克隆是将对象的引用类型成员变量复制过去,而深克隆是将对象的所有成员变量复制过去。 浅克隆的实现步骤: * 被复制的类需要实现Clonenable接口。 * 覆盖clone()方法,访问修饰符设为public。 * 方法中调用super...

Global site tag (gtag.js) - Google Analytics