Java-数组拷贝
数组拷贝
首先了解深拷贝 浅拷贝
数组的四种拷贝方式:
1.for循环拷贝
代码示例:
import java.util.Arrays;
public class TestDemo{
public static void main(String[] args) {
int[] array1 ={1,2,3,4,5,6};
int[] array2 =new int [array1.length];
for (int i = 0; i <array1.length ; i++) {
array2[i] = array1[i];
}
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
结果:
此时,修改array2 0下标的值,发现对array1没影响;
import java.util.Arrays;
public class TestDemo{
public static void main(String[] args) {
int[] array1 ={1,2,3,4,5,6};
int[] array2 =new int [array1.length];
for (int i = 0; i <array1.length ; i++) {
array2[i] = array1[i];
}
System.out.println("==============");
array2[0]=99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
结果:
创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中. 因此, 修改原数组, 不会影响到新数组,即通过一个引用去修改拷贝后的值,发现并不影响原来对象的值,这种拷贝属于深拷贝。
2.copyof拷贝
代码示例:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6};
System.out.println(Arrays.toString(array1));
int[] array2 = Arrays.copyOf(array1,array1.length);
System.out.println("==============");
array2[0]=99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结果:
同第一个: copyOf 是将数组进行了 深拷贝, 即又创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中。因此, 修改原数组,不会影响到新数组。
3.System.arraycopy拷贝

import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4, 5, 6};
int[] array2 = new int[array1.length];
System.out.println(Arrays.toString(array1));
System.arraycopy(array1, 0, array2, 0, array1.length);
System.out.println("==============");
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
结果:
System.arraycopy拷贝也为深拷贝。
前三种拷贝方式速度最快是System.arraycopy拷贝。
4.clone拷贝
引用.clone
克隆 这个引用所指向的对象
这个引用所指向的对象就会被克隆(生成一个副本)
- 1
- 2
- 3
代码示例;
public static void main(String[] args) {
int[] array1 = {1, 8, 9, 4, 13, 26};
System.out.println(Arrays.toString(array1));
//array2 指向了刚刚生成的副本
int [] array2 = array1.clone();
System.out.println("==============");
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结果:
此时也可以看出,修改原数组, 不会影响到新数组。所以也为深拷贝。
实际上,本质来说这四种都属于浅拷贝
上面四种属于深拷贝的原因是因为刚刚数组中存放的是简单类型。
如果放的是引用类型,它们均属于浅拷贝。
画图说明浅拷贝:
当数组中存放的是引用类型时,修改array2中的某个元素的值,同时也修改了array1中的值,这种方法叫浅拷贝。
怎么修改成深拷贝呢?当我们拷贝array1时,将它所引用的值也拷贝过来,此时修改array2中的某个元素的值,array1中的值不变,如图:
总结:
这四种数组拷贝的方式均为浅拷贝
几个小知识点:
1.拷贝部分数组;
代码示例:
public static void main(String[] args) {
int[] array1 = {2, 8, 9, 10, 12, 26};
int[] ret = Arrays.copyOfRange(array1,2,5);
System.out.println(Arrays.toString(ret));
}
- 1
- 2
- 3
- 4
- 5
结果:
2.比较两个数组
代码示例:
public static void main(String[] args) {
int[] array1 = {2, 8, 9, 10, 12, 26};
int[] array2 = {2, 8, 9, 10, 12, 26, 30,35};
System.out.println(Arrays.equals(array1, array2));
}
- 1
- 2
- 3
- 4
- 5
结果:
3.数组完全填充
代码示例:
public static void main(String[] args) {
int[] array1 =new int[10];
Arrays.fill(array1,6);
System.out.println(Arrays.toString(array1));
}
- 1
- 2
- 3
- 4
- 5
结果:
4.数组部分填充
代码示例:
public static void main(String[] args) {
int[] array1 =new int[10];
Arrays.fill(array1,2,6,8);
System.out.println(Arrays.toString(array1));
}
- 1
- 2
- 3
- 4
- 5
结果:
完。(要我的命)
原文章:https://blog.csdn.net/weixin_44436675/article/details/112012315
Java-数组拷贝的更多相关文章
- Java 数组拷贝方法 System.arraycopy
System类提供的数组拷贝方法: public static native void arraycopy(Object src, int srcPos, Object dest, int destP ...
- Java数组拷贝的五种方法
在Java中有多种方法可以拷贝一个数组,到另外一个数组. 1.循环拷贝 在循环拷贝方法中,只需要利用i,移动指针即可复制所有数组到arrayB中. for(int i=0;i<arrayA.le ...
- Java数组声明与拷贝的几种方式
Java数组声明的三种方式 第一种(声明并初始化): 数据类型[] 数组名={值,值,...}; 例:int[] a = {1,2,3,4,5,6,7,8}; ...
- java 数组复制
http://www.cnblogs.com/zhengbin/p/5671403.html http://www.cnblogs.com/jjdcxy/p/5870524.html Java数组拷贝 ...
- java杂记——数组拷贝
这里介绍两种java提供的数组拷贝方法: (1)Arrays提供的copyOf(T src, T desLength)和copyOfRange(T src, int from, int to) (2) ...
- Java基础知识强化85:System类之arraycopy()方法(数组拷贝)
1. arraycopy方法(数组拷贝) public static void arraycopy(object src,int srcPos,Object dest,int destPos, int ...
- Java 数组的三种创建方法,数组拷贝方法
public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...
- Java数组(初学者必看)
数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...
- java提高(15)---java深浅拷贝
#java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...
- Java开发知识之Java数组
Java开发知识之Java数组 一丶数组简介 首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构 在Java中数组可以 ...
随机推荐
- 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)
0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...
- Windows PE 第十二章 PE变形技术
PE变形技术 这章东西太多,太细了.这里我只记录了一些重点概念.为后面学习做铺垫. PE变形:改变PE结构之后,PE加载器依然可以成功加载运行我们的程序. 一 变形常用技术: 结构重叠技术.空间调整技 ...
- 异常检测算法Robust Random Cut Forest(RRCF)关键定理引理证明
摘要:RRCF是亚马逊发表的一篇异常检测算法,是对周志华孤立森林的改进.但是相比孤立森林,具有更为扎实的理论基础.文章的理论论证相对较为晦涩,且没给出详细的证明过程.本文不对该算法进行详尽的描述,仅对 ...
- Java 给Word添加数字签名
本文以Java程序代码为例,介绍如何给Word文档添加数字签名. 程序运行环境 IntedliJ IDEA JDK 1.8.0 Jar包:spire.doc.jar 4.5.1 Word文档:.doc ...
- Python数模笔记-(1)NetworkX 图的操作
1.NetworkX 图论与网络工具包 NetworkX 是基于 Python 语言的图论与复杂网络工具包,用于创建.操作和研究复杂网络的结构.动力学和功能. NetworkX 可以以标准和非标准的数 ...
- [bug] Unable to create initial connections of pool.
原因1 pom中mysql依赖的版本不对,导致无法连接mysql 原因2 SSL设置问题 参考 https://blog.csdn.net/qq_26346457/article/details/79 ...
- [C] gcc
概述 GNU C Compiler 流程 预处理,生成.i文件(中间文件,看不到) 编译,生成.s文件(中间文件,看不到) 汇编,生成.o文件 链接,生成可执行文件 参数 -E:预处理 -S:预处理, ...
- canal 环境搭建 canal 与kafka通信(三)
canal 占用了生产者 .net core端 使用消费者获取canal 消息 安装 Confluent.Kafka demo使用 1.3.0 public static void Consumer ...
- Linux巡检常用命令
# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...
- libvirtd 启动成功,但却没有监听
现象: 执行 systemctl start libvirtd在其它机器上进行测试是否监听:virsh -c qemu+tcp://host/system libvirtd启动成功,没有报错,但却没有 ...