ArrayList复制问题

ArrayList的Clone方法的巧妙使用 一、ArrayList的Clone方法的源码 返回一个Object对象,所以在使用此方法的时候要强制转换。 ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,属于浅复制。 public Object clone() { try { @SuppressWarnings("unchecked") ArrayList<E> v = (ArrayList<E 阅读详情

代码

package S;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


public class T802 {
    public static void main(String[] args) {
        ArrayList<Stu> rawArrayList=new ArrayList<Stu>();
        for (int i = 0; i <6; i++) {
            Stu ssStu=new Stu();
            ssStu.type=i;
            ssStu.url="http://url/"+i+"jpg";
            rawArrayList.add(ssStu);
        }
        System.out.println(rawArrayList);

        System.out.println("-------new ArrayList<Stu>(rawArrayList)-----");
        ArrayList<Stu> newArrayList=new ArrayList<Stu>(rawArrayList);
        int dex=0;
        Stu  stu1=newArrayList.get(dex);
        stu1.url=stu1.url+"---new ArrayList<Stu>(rawArrayList)----";
        newArrayList.set(dex, stu1);
        System.out.println(newArrayList);
        System.out.println("-----ArrayList2修改是否影响ArrayList1---");
        System.out.println(rawArrayList);
        System.out.println(newArrayList);
        System.out.println(newArrayList==rawArrayList);

        System.out.println("-------尝试克隆-----");
        ArrayList<Stu> cloneArrayList=(ArrayList<Stu>) rawArrayList.clone();
        System.out.println(cloneArrayList);
        int dex2=1;
        Stu  stu2=cloneArrayList.get(dex2);
        stu2.url=stu2.url+"===rawArrayList.clone()=====clone====";
        cloneArrayList.set(dex2, stu2);
        System.out.println("-----clone的ArrayList修改是否影响原来的ArrayList---");
        System.out.println(rawArrayList);
        System.out.println(cloneArrayList);
        System.out.println(cloneArrayList==rawArrayList);






        System.out.println("-------尝试一个一个元素复制-----");
        ArrayList<Stu> anotherArrayList=new ArrayList<Stu>();
        for (int i = 0; i < rawArrayList.size(); i++) {
            anotherArrayList.add(rawArrayList.get(i));
        }
        System.out.println(anotherArrayList);
        int dex3=2;
        Stu  stu3=anotherArrayList.get(dex3);
        stu3.url=stu3.url+"===一个一个元素复制====";
        anotherArrayList.set(dex3, stu3);
        System.out.println("-----一个一个元素复制---修改是否影响原来的ArrayList---");
        System.out.println(rawArrayList);
        System.out.println(anotherArrayList);
        System.out.println(anotherArrayList==rawArrayList);

        System.out.println("-------尝试一个一个元素复制--只复制简单数据---");
        ArrayList<Stu> copyArrayList=new ArrayList<Stu>();
        for (int i = 0; i < rawArrayList.size(); i++) {
            Stu stu=rawArrayList.get(i);
            Stu stuCopy=new Stu();
            stuCopy.url=stu.url;
            stuCopy.type=stu.type;
            copyArrayList.add(stuCopy);
        }
        System.out.println(copyArrayList);
        int dex4=3;
        Stu  stu4=copyArrayList.get(dex4);
        stu4.url=stu4.url+"--------只复制简单数据---";
        copyArrayList.set(dex4, stu4);
        System.out.println("-----只复制简单数据---修改是否影响原来的ArrayList---");
        System.out.println(rawArrayList);
        System.out.println(copyArrayList);
        System.out.println(copyArrayList==rawArrayList);




        System.out.println("-------先new后尝试克隆-----");
        ArrayList<Stu> newcloneArrayList=new ArrayList<Stu>();
        newcloneArrayList=(ArrayList<Stu>) rawArrayList.clone();
        System.out.println(newcloneArrayList);
        int dex5=4;
        Stu  stu5=newcloneArrayList.get(dex5);
        stu5.url=stu5.url+"==---先new后尝试克隆--====";
        newcloneArrayList.set(dex5, stu5);
        System.out.println("-----先new后尝试克隆---是否影响原来的ArrayList---");
        System.out.println(rawArrayList);
        System.out.println(newcloneArrayList);
        System.out.println(newcloneArrayList==rawArrayList);


        try {
            System.out.println("-------deepCopy-----");
            ArrayList<Stu> deepCopyArrayList=(ArrayList<Stu>) deepCopy(rawArrayList);
            System.out.println(deepCopyArrayList);
            int dex6=5;
            Stu  stu6=deepCopyArrayList.get(dex6);
            stu6.url=stu6.url+"==---deepCopy-====";
            deepCopyArrayList.set(dex6, stu6);
            System.out.println("-----deepCopy---是否影响原来的ArrayList---");
            System.out.println(rawArrayList);
            System.out.println(deepCopyArrayList);
            System.out.println(deepCopyArrayList==rawArrayList);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //使用深拷贝是对象必须是 implements Serializable
    //否则java.io.NotSerializableException: S.Stu

    public static <T> List<T> deepCopy(List<T> src) throws Exception{  
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
        ObjectOutputStream out = new ObjectOutputStream(byteOut);  
        out.writeObject(src);  

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
        ObjectInputStream in = new ObjectInputStream(byteIn);  
        @SuppressWarnings("unchecked")  
        List<T> dest = (List<T>) in.readObject();  
        return dest;  
    } 
}
class Stu implements Serializable{
    //    type  int 广告类型
     int type;

    //    url   String  广告展示的图片地址或者视频地址或者网页地址
     String url;

    @Override
    public String toString() {
        return "Stu [type=" + type + ", url=" + url + "]";
    }

}

分析

只有简单复制元素或者深拷贝时才不会影响到原来的ArrayList

可以参考这个分析
http://blog.csdn.net/demonliuhui/article/details/54572908

//使用深拷贝是对象必须是 implements Serializable
//否则java.io.NotSerializableException: S.Stu
用序列化实现ListT 实例的深复制(推荐) 如果 List 里的 T 是引用类型(如myClass类),则在 像这种写法: List lists1 = new List() { new myClass(), new myClass() }; List lists2 = new List(lists1 ); 其实是一个浅复制的过程。 如果要实现深复制,通过有几种做法,可以用foreach, 或者重写Clone()方法。 但最好用和最方便的方法还是使用【序列化】的方式来实现。 序列化是指将对象转换为字节流的形式,然后保存在内存或者数据库中 立即下载

相关推荐

AI图像识别在临电配电箱安全检测中的应用与实践

计算机视觉与AI图像识别技术正逐步改变传统工业检测方式。通过深度学习模型如YOLOv5和ResNet,系统能自动识别设备元件并分析其状态,大幅提升检测效率和准确性。这种技术特别适用于需要严格遵循行业标准的场景,如临电配电箱的安全检测。将《施工现场临时用电安全技术规范》等条文转化为可量化的算法,AI系统能自动检查PE线连接、漏保功能等关键项目。实际应用表明,此类解决方案可使电气事故率下降90%以上,同时检测耗时缩短80%,为工地安全提供了智能化保障。

weixin_29042035的博客 328

对象的深拷贝(结合泛型)

/** * 通过序列化进行深克隆 DeepCopyUtil * * @author leihz * @date 2017/11/28 13:05 */ public class DeepCopyUtil { public static <T> T deepClone(T obj) throws IOException, ClassNotFoundExceptio...

weixin_30725467的博客 493

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9192

java之list对象拷贝(亲测)

java之list对象拷贝

gb4215287的博客 2137

python机器人编程——用pytorch实现六轴机械臂的正向和逆向数值解算,及python算法解析

前面对六轴(或多轴)机械臂进行了一些研究,特别是利用几何进行简化,实现逆解,来完成比较简单的搬用任务。然而,如果需要比较精确的操作任务,可能需要更加复杂的机械臂解算。其中比较复杂的是数值解算,这种解算往往涉及到比较复杂的机器人运动等原理知识,比较难以上手。但是,python的生态挺全面,已经有很多牛人实现了数值解法,但是去看他们的代码,还是觉得费劲。此外,随着深度神经网络的兴起,很多是用建立深度学习神经网络,去利用机械臂输入输出的大数据,训练机械臂的控制模型,这个上手也比较慢。

JAMES费的空间 5791

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

java对象的深拷贝方法

public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException { // 将对象写到流里 ByteArrayOutputStream bo = new ByteArrayOutputStream(); Ob...

kanglong129的博客 579

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1732

关于Arrays.copyOfRange一个易错点

Arrays.copyOfRange方法可以实现对一个数组一定范围内元素的拷贝。其函数原型为:static type copyOfRange(type[] a, int start, int end)参数:a    类型为8大基本类型的数组。start    起始下标(包含这个值)。end    终止下标(不包含这个值)。使用方法如:int [] s1 = {1,2,3,4,5}; int [] ...

MidnightDJ的博客 2832

保姆级教程:Windows下用GDC-Client下载TCGA数据,从环境变量配置到成功下载

本文提供Windows平台下使用GDC-Client下载TCGA数据的完整教程,从环境变量配置到成功下载。详细介绍了GDC-Client工具的安装、系统环境变量设置、配置文件优化以及数据下载实战技巧,帮助生物信息学研究者高效获取TCGA数据库中的癌症基因组数据。

weixin_42520025的博客 403

《Arduino与LabVIEW开发实战》第2章 LabVIEW基础

第2章 LabVIEW基础 2.1 LabVIEW与虚拟仪器 2.1.1 什么是虚拟仪器 仪器仪表发展方向有很多,其中一个重要方向是将计算机和仪器结合起来。具体来说有两种方式,一种是将微处理器或微控制器嵌入到仪器中,构建智能化的内含嵌入式系统的仪器仪表,这是嵌入式仪器;另一种是将仪器装入计算机中,以通用计算机硬件及操作系统为载体,外配数据采集卡等外部设备,通过编制不同功能的程序,以实现多种仪...

jxgy01的博客 490

List整体复制成另一个类型的List集合

【代码】List整体复制成另一个类型的List集合。

goxingman的博客 621

08-StarRocks性能调优FAQ

StarRocks性能调优摘要 本文提供了StarRocks数据库性能调优的常见问题解答,涵盖查询优化、索引设计、分区策略和系统配置等关键方面。主要内容包括:查询优化技巧(使用EXPLAIN分析、避免全表扫描、优化JOIN和聚合查询);索引选择与维护建议(高频查询列索引、复合索引);分区策略设计(时间分区、范围分区)及其管理方法;以及系统内存配置优化(JVM参数调整、查询内存限制设置)。这些优化措施可显著提升StarRocks的查询性能和系统效率。

欢迎来到我的博客,一起探索代码里的世界! 541

JAVA:ArrayList的浅复制问题

ArrayList的add方法的源码,可以看到仅仅是把对象用’='号复制了一下,但是更改如果更改外边的e的话,ArrayList里的对象就会随之改变 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = ...

qq_42636010的博客 748

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java复制arraylist_Java - 复制ArrayList

有时候当我们需要复制ArrayList时,最快的方法是新建一个实例,其实每个Collection类都有一个对应的通过自己复制的构造方法。clone()方法本身是有缺陷的,不推荐使用。推荐的做法如下:Listoriginal=//somelistListcopy=newArrayList(original);这个问题是在做HBase项目时发现的,当Scanner获得下一个结果时,如...

weixin_39974223的博客 383

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ArrayList中多线程的不安全问题

方案二:List list = Collections.synchronizedList(new ArrayList<>());写入时复制,就是在写入时,先将原数据复制,再将需要的数据插入,最后返回给原数组。多个线程同时去添加ArryList,出现了报错,抛出来异常。方案一:List list = new Vector();为什么可以这样输出,是一种函数是接口,我们先过个耳熟。因为synchronized是不高效的行为。ArrayList.add方法是不安全的。该方法使用了Lock锁,所以是安全的。

qq_64420904的博客 753

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java arraylist二维_java-将二维ArrayList复制为新的

所以我遇到的问题是复制2d arraylist之后,将元素从一个2d arraylist更改会影响另一个2d arraylist.我希望它们在内存中完全分开.第一个示例显示了它如何与一维数组列表一起正确使用…import java.util.ArrayList;public class QuickTest {public static void main(String[] args) {Array...

weixin_42140625的博客 627

ArrayList的复制

想复制一个ArrayList,本来想这样使用:   ArrayList src = new ArrayList(); // 中间省略了src的赋值操作 // ... ArrayList dest = new ArrayList(); Collections.copy(dest,src);   谁知,报错: 错误: IndexOutOfBoundsException - ...

xiaolongfeixiang的专栏 229

JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)

目录 一、异常演示 二、解决方案 1、vector 2、Collections工具类 3、CopyOnWriteArrayList 写时复制技术 三、写时复制技术 1、特性 2、原理 一、异常演示 循环创建线程,将数据放入集合的同时,从集合中读取数据。 /** * list集合线程不安全问题 */ public class ThreadDemo04 { ......

m0_49499183的博客 5521

在java中arraylist_在Java中将ArrayList添加到另一个ArrayList

我有以下Java代码,其中我试图将ArrayList复制到另一个ArrayList。ArrayList nodes = new ArrayList();ArrayList NodeList=new ArrayList();ArrayList list=new ArrayList();for(int i=0;iNode childNode = PropertyNode.item(i);NodeLi...

weixin_39667080的博客 878

Java - 复制ArrayList

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34419321的博客 341

Java中ArrayList的对象引用问题

记录一次开发期间遇到的关于Java中的ArrayList中关于对象引用的问题

2的32次方 1344

ArrayList面试问题

本文由 ImportNew - kobekillerjun 翻译自 vitalflux。欢迎加入Java小组。转载请参见文章末尾的要求。 我以面试官的身份参加过很多Java的面试,以下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有完全弄明白,似懂非懂。所以我写了一篇相关的文章,帮助初级Java研发人员弄清楚这些问题。文章列举了和Java ArrayList

u010221377的专栏 714

解决集合类不安全问题——写时复制

通过对ArrayList类中的Add方法的源码探究,我们发现ArrayList的Add方法并不是一个线程安全的方法,当对ArrayList进行add的高并发操作时,会报:java.util.ConcurrentModificationException(并发修改异常)错误,针对这种问题,我们可以通过写时复制的方式进行解决(CopyOnWriteArrayList)。 /** * Appends the specified element to the end of this list. * ...

bc_Reversing的博客 318

ArrayList常见问题

1、ArrayList的大小是如何自动增加的?你能分享一下你的代码...

weixin_34262482的博客 154
上一篇: 系列化
下一篇: 主线程和子线程
SeekSage
SeekSage 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄13年 364粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值