首页 > 编程语言 >java深拷贝的几种方法

java深拷贝的几种方法

时间:2023-12-20 19:05:06浏览次数:30  
标签:java clone List 几种 source return 拷贝 序列化


  1. 使用序列化和反序列化:将集合对象序列化为字节流,然后再反序列化成一个新的对象。这种方式需要确保集合中的所有元素都是可序列化的。

import java.io.*;

public static source) { try { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(source);

ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
    ObjectInputStream in = new ObjectInputStream(byteIn);
    @SuppressWarnings("unchecked")
    List<T> copy = (List<T>) in.readObject();

    return copy;
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
    return null;
}

}

  1. 使用 clone 方法:如果集合中的元素类实现了 Cloneable 接口,并且正确地重写了 clone() 方法,那么可以通过调用 clone() 方法来实现深拷贝。

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

// 实现 Cloneable 接口

class MyClass implements Cloneable { // ...

@Override

protected Object clone() throws CloneNotSupportedException {
    return super.clone();
}

}

// 深拷贝方法

public static copy = new ArrayList<>(); for (T item : source) { try { @SuppressWarnings("unchecked") T clonedItem = (T) item.clone(); copy.add(clonedItem); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } return copy; }

  1. 使用第三方库:如果你不想自己实现深拷贝的逻辑,可以使用一些第三方库,如 Apache Commons Lang 的 SerializationUtils 类或 Google Guava 的 Lists 类提供的方法来实现深拷贝。

 

import org.apache.commons.lang3.SerializationUtils;

import com.google.common.collect.Lists;


// 深拷贝方法(使用 Apache Commons Lang)

public static <T extends Serializable> List<T> deepCopy(List<T> source) {

   return SerializationUtils.clone(source);

}


// 深拷贝方法(使用 Google Guava)

public static <T extends Serializable> List<T> deepCopy(List<T> source) {

   return Lists.newArrayList(source);

}


在进行深拷贝时,集合中的元素类必须是可序列化的或实现了 Cloneable 接口,并正确地重写了 clone() 方法。另外,深拷贝可能会导致性能损耗,因此在处理大型集合时要谨慎使用。朋友们觉得好用记得点赞

标签:java,clone,List,几种,source,return,拷贝,序列化
From: https://blog.51cto.com/u_15989193/8909893

相关文章

  • Java网络IO-BIO
    JavaBIO就是传统的JavaI/O编程BIO(BlockingI/O):同步阻塞,服务器实现:一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。单线程情况下,只有一个线程可以处理客户端请求,也就是同时只能连接一个客户端。优化点:可以通过线程池机制改善,实现多个客户端连......
  • beanshell导入java文件
    beanshell导入java文件beanshell可以读取class格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用   beanshell可以读取java格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用  ......
  • 基于java语言开发的医院绩效核算系统源码
    医院绩效考核系统全套源码,医院绩效核算系统源码,java语言开发    医院绩效考核系统可根据工作绩效考核管理规定,配置相应的绩效考核模型,从工作量统计、核算维度、核算权重三方面计算工作绩效,利用数据处理和数据分析的支撑作用,实现对工作量统计和绩效考核结果的统计分析展示,为......
  • 前段时间面试Java碰到的一道有意思的题目
    看题前一段时间面试碰见一道题目,感觉挺有意思,特意记录了下来。大概内容就是有一个全局变量i,然后在main方法中有两个嵌套for循环,分别循环100次,然后循环中,开启新线程对变量i执行i++的操作。我对其简单做了一下修改。一起来看下这道题目,不运行,用肉眼的看的话,你觉得是多少?给你1min思......
  • javascript技巧
    1、过滤掉数组中的重复值。constarr=["a","b","c","d","d","c","e"]constuniqueArray=Array.from(newSet(arr));console.log(uniqueArray);//['a','b','c',&#......
  • java设计模式
    三大种类型的设计模式创建型模式:关注对象的创建过程。结构型模式:关注对象与类的组织模式行为型模式:关注对象之间的交互23种设计模式简单工厂模式定义:根据参数的不同返回不同类的实例。工厂方法模式定义:通过工厂子类来确定究竟应该实例化哪一个具体产品类例子:日志记录器......
  • java lambda表达式
    一、函数式编程思想 二、lambda表达式1、lambda表达式的标准格式2、匿名类型和lambda表达式对比 示例:  3、lambda表达式的省略模式 示例: 4、lambda表达式的注意事项 示例: 5、lambda表达式和匿名内部类的区别 示例: ......
  • java网络编程
    一、网络编程入门1、网络编程概述 2、网络编程的三要素 3、IP地址  InetAddress类示例: 4、端口5、协议  二、UDP通信程序1、UDP通信原理2、UDP发送数据 示例:packagecom.itbianma01;importjava.io.IOException;importjava.net.*;pu......
  • Java登陆第二十六天——Http
    Http是一种基于TCP/IP的协议。相同的,它有客户端和服务端。Http的交互方式客户端向服务端发送的总是请求;服务端向客户端返回的总是响应Http的版本HTTP/0.9:初代目单行HTTP,只能返回一个HTML页面HTTP/1.0:二代目每次请求和响应都会建立和关闭一次连接(短链接)新增了三种......
  • Java IO 模型
    IO是个啥IO,是input/output的缩写,表面意思是输入/输出,描述计算机中数据流动的过程,实际上就是CPU、内存和外部进行数据交换的过程举个例子,某个进程要获取到数据的过程如下:1.请求:进程请求外部数据2.准备:缓冲区准备数据,通过磁盘或者网络读取数据到内核空的缓冲区3.拷贝:将数......