在上一篇博客中,浅谈了 关于 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 数组的拷贝(复制一个相同数组)相关推荐

  1. python中2d_【IT专家】如何在Python中复制一个2D数组?(复制)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 如何在 Python 中复制一个 2D 数组? ( 复制 ) 如何在 Python 中复制一个 2D 数组 ?( 复制 )[ 英 ]How to  ...

  2. java怎么定义char_java定义一个char数组

    i++){ System. out .println(arr[i]); } } } 运行结果: 1 2017.02.14 数组课后题 2.将一个字符数组的值 ( neusofteducation)拷贝 ...

  3. java基础—IO流——复制一个文件到当前文件夹中

    复制一个文件到当前文件夹中 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWr ...

  4. c语言把一个数组赋值给另一个数组_如何把一个固定数组的值传递给另外一个数组...

    大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...

  5. 什么是类数组,怎么实现一个类数组

    #类数组顾名思义 类似数组 的什么什么东西.... 这里封装了一个方法 将dom层中的四个元素节点依次插入自定义的类数组temp中之后返回. 其实类数组就是定义了一个{} 空对象,里面添加length ...

  6. c语言如何输出整形数组,C语言 有一个整形数组a,有10个元素,要求输出数组中的全部元素...

    有一个整形数组a,有10个元素,要求输出数组中的全部元素 解题思路:引用数组中各元素的值有3种方法:1.下标法,如a[3];2.通过数组名计算数组元素的地址,找出元素的值 3.用指针变量指向数组元素. ...

  7. byte数组转int数组 java_如何把一个byte数组的数字转换成int

    这里简单记录下两种转换方式: 第一种: 1.int与byte[]之间的转换(类似的byte short,long型) [java] view plain copy /** * 将int数值转换为占四个 ...

  8. python 三维矩阵乘以二维矩阵_如何将一个二维数组和一个三维数组矩阵相乘得到一个三维数组?...

    问题是numpy把多维数组看作矩阵的栈,最后两个维总是假定为线性空间维.这意味着点积不能通过折叠3d数组的第一个维度来工作.在 相反,你能做的最简单的事情就是把你的3d数组重塑成2d数组,做矩阵乘法, ...

  9. 【Java】总结Java数组的拷贝和输出

    Java的clone()方法 想clone(),先需要实现Cloneable接口,如此才能拷贝. 众所周知,Java中的clone()多为浅拷贝,即只复制引用,不会另外开辟完整空间重新存储的,一旦原先 ...

最新文章

  1. Postfix(一):CentOS 下安装postfix
  2. Python Train_机器学习--基于Python的简单线性回归
  3. 【编程3】二叉树遍历(LeetCode.102)
  4. 东北大学 计算机调剂,2018年东北大学信息科学与工程学院考研调剂信息
  5. 不就是个短信登录API嘛,有这么复杂吗?
  6. python队列来做什么_python分布式爬虫中的消息队列是什么?
  7. 《阿里巴巴Java开发规约》插件使用详细指南
  8. apple tv 开发_如何跨多台Apple TV同步Apple TV的主屏幕
  9. namenode开启DEBUG
  10. Javascript事件模型系列(一)事件及事件的三种模型
  11. VML编程之------oval圆rect矩型《VML极道教程》原著:沐缘华
  12. Linux的java配置及tomcat的启动
  13. 32利用文件系统保存数据_数据管理技术的产生与发展
  14. 离散数学 习题篇 —— 等价关系的计数
  15. 基于java坦克大战游戏
  16. 协同办公软件竞品分析
  17. Nodejs报内部错误 TypeError: Cannot read property ‘destroy‘ of undefined的解决方法
  18. 2018 微信数据报告,看看你的微信用了多少天?
  19. Python:类(class)的变量声明
  20. XML DOM摘要五(XPath)

热门文章

  1. Android 注解的使用与注意事项
  2. js检查元素是否包括在数组中
  3. jQuery插件编写基础之“又见弹窗”
  4. 打造一个全命令行的Android构建系统
  5. mysql select语句执行顺序
  6. OpenJudge数据结构与算法-计算点的距离并排序
  7. 进程和线程相关小知识
  8. [jQuery原理] jQuery基本结构
  9. 前端性能优化的重要方案:图片懒加载
  10. 输出整数各位数字 (15 分)