Java 数组的拷贝(复制一个相同数组)
在上一篇博客中,浅谈了 关于 java 中数组的创建,遍历,打印相关问题,这一篇想谈一谈 java 中 数组的拷贝 问题,C语言中数组是直接在内存上给相应变量一定大小的空间,对数组的赋值,改变是直接在内存层面操作的,但是在java中因为数组是一种引用类型,创建一个数组本质是创建了一个 相应类型的对象,对数组的操作也只是通过引用对对象中相应数据的改变。
C语言中要复制一个数组就先要创建另外一个数组,在通过对数组的遍历,依次将第一个数组每个元素赋值 到 第二个数组中,java中也可以这样操作。
public static void main(String[] args) {int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7};int[] b = new int[7];for (int i = 0; i < 7; ++i){b[i] = a [i];}System.out.println("这是数组a: " + Arrays.toString(b));System.out.println("这是数组b: " + Arrays.toString(a));}
}
运行结果:
但是 在 java 中存在 这种情况 :
public static void main(String[] args) {int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7};int[] b = a; System.out.println("这是数组a: " + Arrays.toString(a));System.out.println("这是数组b: " + Arrays.toString(b));}
}
运行结果如下:
那么这真的是完成了一个数组的拷贝吗? 从运行结果来看 貌似 是这样,再来看下面这段代码:
public static void main(String[] args) {int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7};int[] b = a;System.out.println("这是数组a: " + Arrays.toString(a));System.out.println("这是数组b: " + Arrays.toString(b));//改变数组b的第一个元素b[0] = 10;System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));System.out.println("改变后的数组b: " + Arrays.toString(b));}
}
它的运行结果:
从代码中我们可以看到 ,改变的 是数组b的第一个元素的值,但是从输出结果来看数组a中第一个元素的值也被改变了,这是为什么呢? 你可以先思考一下再往下看。
要讲清楚这个问题就不得不稍微讲一下 java中创建一个 数组 背后 实际进行了哪些操作 。
public static void main(String[] args) {int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7};int[] b = a;}
这段代码实际是这样的
这就不难理解为是么执行 b[0] = 10 ; 这步操作时,为什么a[0] 也会等于10 了。
所以想要复制一个数组 不能 直接int[] b = a;
在Arrays 类中 有方法
static type copyOf(type[ ],int length)
这可以将一个数组的值拷贝到一个新的数组中去,length为要拷贝原数组的长度,可以小于原数组长度,此时要多长就拷贝多长,剩下的会自动截断;可以大于原数组长度,多余的会自动赋默认初始值(如果不知道赋什么初始值可以看我上一篇博客中有提到);当然也可以等于原数组长度。
具体实现如下:
public static void main(String[] args) {int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7};//新数组长度等于原数组长度int[] b = Arrays.copyOf(a,a.length);//新数组长度小于原数组长度,截断int[] c = Arrays.copyOf(a,3);//新数组长度大于原数组长度,多余的元素自动赋初始值int[] d = Arrays.copyOf(a,10);System.out.println("这是数组b: " + Arrays.toString(b));System.out.println("这是数组c: " + Arrays.toString(c));System.out.println("这是数组d: " + Arrays.toString(d));//改变数组b的第一个元素b[0] = 10;System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));System.out.println("改变后的数组b: " + Arrays.toString(b));}
运行结果如下:
可以看出 这种 拷贝 是创建了新的对象,执行 b[0] = 10 ; 并不会影响到原数组a[0]的值。
Arrays类中还有 一个 方法
static type copyOfRange(type[ ] a, int strat, int end)
该方法的含义是返回与类型a相同的一个数组,其长度是end-start,截取的内容是原数组的[start, end) ,就是说不包括 type[end]这个数。
小结:
java中真正拷贝一个数组的方式可以说有三种
1.通过遍历数组,依次赋值,最终拷贝一个数组。
2.运用static type copyOf(type[ ],int length) 方法。
3.运用static type copyOfRange(type[ ] a, int strat, int end) 方法。
针对初学者的总结,大佬勿喷,如果有错误还望海涵,最好在告诉我嘻嘻。
Java 数组的拷贝(复制一个相同数组)相关推荐
- python中2d_【IT专家】如何在Python中复制一个2D数组?(复制)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 如何在 Python 中复制一个 2D 数组? ( 复制 ) 如何在 Python 中复制一个 2D 数组 ?( 复制 )[ 英 ]How to ...
- java怎么定义char_java定义一个char数组
i++){ System. out .println(arr[i]); } } } 运行结果: 1 2017.02.14 数组课后题 2.将一个字符数组的值 ( neusofteducation)拷贝 ...
- java基础—IO流——复制一个文件到当前文件夹中
复制一个文件到当前文件夹中 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWr ...
- c语言把一个数组赋值给另一个数组_如何把一个固定数组的值传递给另外一个数组...
大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...
- 什么是类数组,怎么实现一个类数组
#类数组顾名思义 类似数组 的什么什么东西.... 这里封装了一个方法 将dom层中的四个元素节点依次插入自定义的类数组temp中之后返回. 其实类数组就是定义了一个{} 空对象,里面添加length ...
- c语言如何输出整形数组,C语言 有一个整形数组a,有10个元素,要求输出数组中的全部元素...
有一个整形数组a,有10个元素,要求输出数组中的全部元素 解题思路:引用数组中各元素的值有3种方法:1.下标法,如a[3];2.通过数组名计算数组元素的地址,找出元素的值 3.用指针变量指向数组元素. ...
- byte数组转int数组 java_如何把一个byte数组的数字转换成int
这里简单记录下两种转换方式: 第一种: 1.int与byte[]之间的转换(类似的byte short,long型) [java] view plain copy /** * 将int数值转换为占四个 ...
- python 三维矩阵乘以二维矩阵_如何将一个二维数组和一个三维数组矩阵相乘得到一个三维数组?...
问题是numpy把多维数组看作矩阵的栈,最后两个维总是假定为线性空间维.这意味着点积不能通过折叠3d数组的第一个维度来工作.在 相反,你能做的最简单的事情就是把你的3d数组重塑成2d数组,做矩阵乘法, ...
- 【Java】总结Java数组的拷贝和输出
Java的clone()方法 想clone(),先需要实现Cloneable接口,如此才能拷贝. 众所周知,Java中的clone()多为浅拷贝,即只复制引用,不会另外开辟完整空间重新存储的,一旦原先 ...
最新文章
- Postfix(一):CentOS 下安装postfix
- Python Train_机器学习--基于Python的简单线性回归
- 【编程3】二叉树遍历(LeetCode.102)
- 东北大学 计算机调剂,2018年东北大学信息科学与工程学院考研调剂信息
- 不就是个短信登录API嘛,有这么复杂吗?
- python队列来做什么_python分布式爬虫中的消息队列是什么?
- 《阿里巴巴Java开发规约》插件使用详细指南
- apple tv 开发_如何跨多台Apple TV同步Apple TV的主屏幕
- namenode开启DEBUG
- Javascript事件模型系列(一)事件及事件的三种模型
- VML编程之------oval圆rect矩型《VML极道教程》原著:沐缘华
- Linux的java配置及tomcat的启动
- 32利用文件系统保存数据_数据管理技术的产生与发展
- 离散数学 习题篇 —— 等价关系的计数
- 基于java坦克大战游戏
- 协同办公软件竞品分析
- Nodejs报内部错误 TypeError: Cannot read property ‘destroy‘ of undefined的解决方法
- 2018 微信数据报告,看看你的微信用了多少天?
- Python:类(class)的变量声明
- XML DOM摘要五(XPath)