java杂记——数组拷贝
这里介绍两种java提供的数组拷贝方法:
(1)Arrays提供的copyOf(T src, T desLength)和copyOfRange(T src, int from, int to)
(2)System.arraycopy(T src, int from, T des, int from, int length)
使用例子:
(1)
int [] a = {1,2,3,4,5,6};
int [] b = Arrays.copyOf(a, 8); //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
int [] c = Arrays.copyOfRange(a, 2, 5); //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。
(2)
int [] a = {1,2,3,4,5,6};
int [] b = new int[8];
System.arraycopy(a, 2, b, 3, 4); //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
//如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常
在方法(2)中,如果目标数组和源数组相同,则先拷贝到一个temp数组中,再从temp数组中拷回目标数组(源)。
当数组是对象数组的时候,上面的两种方法都不能实现深度拷贝。例如:源代码中的
Lesson9_arrayCopyTest.deepArrayCopy()
详细代码如下:
package javaBase16Lesson; import java.util.Arrays; /**
* (1)
* int [] a = {1,2,3,4,5,6};
* int [] b = Arrays.copyOf(a, 8); //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
* int [] c = Arrays.copyOfRange(a, 2, 5); //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。
*
*(2)
* int [] a = {1,2,3,4,5,6};
* int [] b = new int[8];
* System.arraycopy(a, 2, b, 3, 4); //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
* //如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常
*
*(3)
*方法(1)(2)都只是数组的浅拷贝,无法实现深度拷贝
* @author cnx
* @Description : arrayCopyTest
* @CreateDate ; 2014年7月9日 下午6:43:26
*/
public class Lesson9_arrayCopyTest {
public static void main(String[] args) {
// Lesson9_arrayCopyTest.arraysCopyOf();
// Lesson9_arrayCopyTest.systemArraycopy();
Lesson9_arrayCopyTest.deepArrayCopy();
} public static void arraysCopyOf(){
int [] a = {1,2,3,4,5,6};
int [] b = Arrays.copyOf(a, 8); //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
int [] c = Arrays.copyOfRange(a, 2, 5); //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。
System.out.println("a:"+ a.length);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
System.out.println("b:"+ b.length);
for (int i : b) {
System.out.println(i);
}
System.out.println("c:"+ c.length);
for (int i : c) {
System.out.println(i);
}
}
/**
* Copies an array from the specified source array, beginning at the specified position,
* to the specified position of the destination array. A subsequence of array components
* are copied from the source array referenced by src to the destination array referenced by dest.
* The number of components copied is equal to the length argument. The components at positions
* srcPos through srcPos+length-1 in the source array are copied into positions destPos through
* destPos+length-1, respectively, of the destination array.
* If the src and dest arguments refer to the same array object, then the copying is performed
* as if the components at positions srcPos through srcPos+length-1 were first copied to a temporary
* array with length components and then the contents of the temporary array were copied into
* positions destPos through destPos+length-1 of the destination array. <br>
* 如果目标数组和源数组相同,则先拷贝到一个temp数组中,再从temp数组中拷回目标数组(源)
*/
public static void systemArraycopy(){
int [] a = {1,2,3,4,5,6};
int [] b = new int[8];
System.arraycopy(a, 2, b, 3, 4); //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
//如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常
System.out.println("a:"+ a.length);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
System.out.println("b:"+ b.length);
for (int i : b) {
System.out.println(i);
}
} /**
* 上面的两种方法都无法实现深度拷贝
*/
public static void deepArrayCopy(){
Lesson9_array1 [] a1 = {new Lesson9_array1(),new Lesson9_array1()};
Lesson9_array1 [] a2 = null;
Lesson9_array1 [] a3 = new Lesson9_array1[3];
Lesson9_array2 [] b1 = {new Lesson9_array2(),new Lesson9_array2()};
Lesson9_array2 [] b2 = null; a2 = Arrays.copyOf(a1, 3);
System.arraycopy(a1, 0, a3, 0, 2);
b2 = Arrays.copyOf(b1, 3); a1[1].a = "a1";
System.out.println(a2[1].a);
System.out.println(a3[1].a);
b1[1].a = "b1";
System.out.println(b2[1].a);
}
} class Lesson9_array1 implements Cloneable{
public String a = "deep"; public Object clone(){
Object o = null;
try {
o = (Lesson9_array1)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
} public String toString(){
return a;
}
} class Lesson9_array2{
public String a = "deep"; public String toString(){
return a;
}
}
java杂记——数组拷贝的更多相关文章
- Java基础知识强化85:System类之arraycopy()方法(数组拷贝)
1. arraycopy方法(数组拷贝) public static void arraycopy(object src,int srcPos,Object dest,int destPos, int ...
- 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中的拷贝文件FileChannel
以前用Java拷贝文件,只知道写byte数组循环拷贝,今天知道了可以用FileChannel进行拷贝,上代码: 下边是传统的byte数组拷贝方法 </pre><pre name=&q ...
- Java实现文件拷贝的4种方法.
原文地址:http://blog.csdn.net/ta8210/article/details/2073817 使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢? 最近看了看N ...
- java:数组操作工具类 java.util.Arrays包 主要方法详解
Arrays类位于Java.util包下,是一个对数组操作的工具类,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34).Arrays类中的方法可以分为八类: sort(对数组排序) ...
- Java中数组的插入,删除,扩张
Java中数组是不可变的,但是可以通过本地的arraycop来进行数组的插入,删除,扩张.实际上数组是没变的,只是把原来的数组拷贝到了另一个数组,看起来像是改变了. 语法: System.arrayc ...
- java笔记 -- 数组
概念: 数组是一种数据结构, 用来存储同一类型值的集合. 通过一个整型的下标可以访问数组中的每一个值. 声明: int[] a(推荐,将类型int[](整形数组)和变量名分开了) 或者int a[] ...
- java去除数组重复元素的方法
转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...
随机推荐
- POJ 1065
http://poj.org/problem?id=1065 题目的大体意思就是给一些木头长l,重w,有一个机器,如果切割这些木头的话,在i后面切割的i+1根木头满足长度和重量都要大于等于前一根则不需 ...
- CEF3开发者系列之工程和代码结构
CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去.它的设计思想就是易用且兼顾性能. CEF3支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去.它的 ...
- windows8 安装TortoiseSVN后的反应
因为工作需要,昨天安装了TortoiseSVN 64位版,没有马上重启. 随后,IIS中打开页面后浏览器一片空白,没有网页,没有地址,什么都没有.这时还没想到可能是TortoiseSVN的问题.后来实 ...
- ABAP 行列稳定刷新语句
DATA stbl TYPE lvc_s_stbl. stbl-row = 'X'." 基于行的稳定刷新 stbl-col = 'X'." 基于列稳定刷新 ...
- SVN客户端以及使用 for windows
1.首先我们需要下载 "svn小乌龟"后,进行安装.比如我下载如下的: 安装完成后,比如在我的项目在qiandaun1中,我右键就可以看到如下: 说明snv已经安装成功了! 2:c ...
- 括号配对问题_栈<stack>
问题 A: 括号配对问题 时间限制: 3 Sec 内存限制: 128 MB提交: 3 解决: 2[提交][状态][讨论版] 题目描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行 ...
- 屏幕截图、录像FastStone Capture
作为一款极其优秀好用的屏幕截图软件,FastStone Capture 具有体积小巧.功能强大.操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合,截图后的图片编辑与保存选项也特别丰富和方便 ...
- 【python】为什么修改全局的dict变量不用global关键字
转自:http://my.oschina.net/leejun2005/blog/145911?fromerr=qnPCgI19#OSC_h4_8 为什么修改字典d的值不用global关键字先声明呢? ...
- HTML/CSS题库
一. 填空题 使用文本编辑器编辑完HTML后,扩展名可以是__html___或___htm__. 表格的标签是____table______,单元格的标签是____td______. 在编辑ta ...
- Apple Swift编程语言入门教程
Apple Swift编程语言入门教程 作者: 日期: 布衣君子 2015.09.22 目录 1 简介 2 Swift入门 3 简单值 4 控制流 5 函数与闭包 6 对象与类 ...