数组复制java
㈠ java二维数组怎么复制,,array方法行吗麻烦给个例子。谢啦
java的多维数组的:希望采纳
class C{
public static void main(String args[]){
int a[][] = {{1,2,3},{4,5,6}};
int b[][] = new int[a.length][a[0].length];
System.array(a,0,b,0,a.length); //通过array()函数拷贝数组
b[0][0] = 4; //改变数组b[0][0]的值
System.out.println("a[][]");
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
System.out.println("b[][]");
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
打印的结果如下:
a[][]
4 2 3
4 5 6
b[][]
4 2 3
4 5 6
而如果把上述程序中的二维数组改为一维数组,结果却不同。程序如下:
class C{
public static void main(String args[]){
int a[] = {1,2,3};
int b[] = new int[a.length];
System.array(a,0,b,0,a.length); //通过array()函数拷贝数组
b[0] = 4; //改变数组b[0]的值
System.out.println("a[]:");
for(int i=0;i<3;i++){
System.out.print(a[i] + " ");
}
System.out.println();
System.out.println("b[]:");
for(int i=0;i<3;i++){
System.out.print(b[i] + " ");
}
}
}
打印结果如下:
a[]:
1 2 3
b[]:
4 2 3
在
第一个程序中,用b[0][0] =
4;只改变了数组b[0][0]的值,可是结果却是数组a[0][0]的值也发生了改变。而在第二个程序中,由于是一个一维数组,改变了b[0]的
值,a[0]的值却并没有受到影响,所以问题可能就出在数组的维数上。第一个程序中的a 是一个数组的数组(java
中没有多维数组的概念,只有数组的数组),同理b 也是,那么a 含有两个元素,第一个是指向(1,2,3)
这个数组的引用,第二个是指向(4,5,6)这个数组的引用,而arrayCopy 就是负责把数组的内容 过去的,因此 a 的内容 (2
个引用) 被 到b 中去了,因此你对b[0][0] 做修改,a 也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.array方法
注意:
1.上面方法中array效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 array对二维数组进行复制时,是浅拷贝, 即
Object[][] aa;
Object[][] bb = aa.clone();
//or bb=System.array(aa,0,bb, 0, bb.length);
则:
boolean b1 = ( aa[i] == bb[i] ); //false
boolean b2 = (aa[i][j] == bb[i][j]); //true, 可见数组元素只复制了引用。新旧数组指向相同的内存地址,(不论对象数组,还是基本类型数组)。
/**
* 数组的浅拷贝是指数组拷贝时,只拷贝了数组的地址,新旧数组指向同一数据
* 数组的深拷贝,不论数据是基本类型,还是对象类型,都是一样的。
* 对数组来说,不一样的地方在于,当为数组元素赋值时,基本类型值传递,对象类型是引用传递。
*
*/
Object[] a = new Object[]{"String", new Integer(1)};
Object[] b = a;
/**
* 数组深拷贝的方法有如下几种:
* 1。 调用clone
* 2。 调用System.array
* 以上两种对基本类型和对象类型数据效果等同。
* 3。 使用FOR循环,将数组的每个元素复制。(注意调用clone方法)
*
*/
/*
* 当数组数据是基本类型时,
*/
// int[] array = new int[]{0,1,2,3,4};
// int[] = array.clone(); //1.拷贝数据
// System.out.println( .equals(array));
// System.out.println( == array );
// for (int i = 0; i < .length; i++) {
// System.out.print( [i]+", " );
// [i]++; //2.改变新数组数据内容
// System.out.print( [i]+", " );
// System.out.println( array[i]+","); //3.不影响原始数组
// }
// System.out.println();
/*
* 当数组数据是对象类型时,
*/
// Object[] src = new Object[]{ new String("Zhao"),
// Integer.valueOf(1),
// Integer.valueOf(2),
// Integer.valueOf(3),
// Integer.valueOf(4)};
//
// Object[] dest = src.clone(); //1.拷贝数据
//
//// Object[] dest = new Object[5];
//// System.array(src, 0, dest, 0, dest.length);
//
// System.out.println( dest.equals(src));
// System.out.println( dest == src );
// for (int i = 0; i < dest.length; i++) {
// System.out.print( dest[i]+", " );
// dest[i] = new String("KE"); //2.改变新数组内容
// System.out.print( dest[i]+", " );
// System.out.println( src[i]+","); //3.不影响原始数组
// }
// System.out.println();
/**
* 对多维数组(多维基本类型数组和多维对象数组完全一致。)
*
*/
//多维基本类型数组
int[][] aa = new int[][]{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// //多维对象类型数组
// Object[][] aa = new Object[][]{
// { Integer.valueOf(1),Integer.valueOf(2),Integer.valueOf(3) },
// { Integer.valueOf(4),Integer.valueOf(5),Integer.valueOf(6) },
// { Integer.valueOf(7),Integer.valueOf(8),Integer.valueOf(9) }
// };
/**
* 一维数组下的深拷贝在 多维数组 只是浅拷贝!!
*/
int[][] bb = aa.clone(); //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
// int[][] bb = new int[aa.length][aa[0].length];
// System.array(aa, 0, bb, 0, aa.length);
// Object[][] bb = aa.clone();
//// Object[][] bb = new Object[3][3];
//// System.array(aa, 0, bb, 0, aa.length); //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
/**
* 二维数组的深拷贝的实现方式!!! 转为一维数组拷贝。
*/
// for (int i = 0; i < bb.length; i++) { //实现深拷贝的方法!!!!!!!!!!!!
// System.array(aa[i], 0, bb[i], 0, aa[i].length);
// // bb[i] = aa[i].clone();
// }
System.out.println("## 初始 aa:" ); //1. 初始原数组
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
System.out.print(aa[i][j]+" ");
}
System.out.println( );
}
System.out.println("## bb = aa.clone() 后bb:" ); //2. 新数组(值等于原数组的值)
for (int i = 0; i < bb.length; i++) {
for (int j = 0; j < bb[i].length; j++) {
System.out.print(bb[i][j]+" ");
}
System.out.println( );
}
System.out.println("## bb改变后:" ); //3.改变新数组后
for (int i = 0; i < bb.length; i++) {
for (int j = 0; j < bb[i].length; j++) {
bb[i][j] += 10; //for 多维基本类型数组
// bb[i][j] = new String("Zhao"); //for 多维对象类型数组
System.out.print(bb[i][j]+" ");
}
System.out.println( );
}
System.out.println("## bb改变后, aa:" ); //4.输出原数组
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
System.out.print(aa[i][j]+" ");
}
还有和c++不同,java定义int [][]a=new int[3][];是没有问题的,c和c++后面就是必须要有维数,int a[][3];。
如果list里面全是String[],转为String[][],使用
(String[][]) bodyDataList.toArray(new String[bodyDataList.size()][]);这样就能转成功,还一直不清楚toArray(x)x里面的东西,因为java里面只有array对象
㈡ java怎么把数组复制
publicclassArraysCopy{
publicstaticvoidmain(String[]args){
int[]arr={1,2,3,4};
int[]arr2=newint[arr.length];
System.array(arr,0,arr2,0,arr2.length);
System.out.println(java.util.Arrays.toString(arr2));
}
}
参数:
src-源数组。
srcPos-源数组中的起始位置。
dest-目标数组。
destPos-目标数据中的起始位置。
length-要复制的数组元素的数量。
㈢ Java中数组复制的几种方法
最简单的一种就是直接挨个把原数组的值赋给新数组 不过一般都用System.array(原数组起始复制的标号,新数组接收复制的起始标号,赋值的长度) 这个方法
例如:public class llx { public static void main(String args[]) { int a[] = {1,2,3,4,5}; int b[] = new int[10];//搞一个10位置的新数组 System.array(a[0],b[0],a.length);//从a的第一个位置开始复制;从b的第一个位置开始接收;一共接收a的总长度(a.length);;;懂了吗?这样的话 b的前5个值就被传递了,但是后5个是初始值0。 }}
㈣ JAVA 数组拷贝
array方法只是浅层复制,就是单纯的把值赋给目标 当值为引用类型时,这毫无意义,因为复制出来的对象不能独立于原对象,当原来的引用内容改变时,复制的也改变。 当拷贝一维数组时,数组里面也必须存放非引用值(比如int,char)才有效,不然你修改也一样会影响原数组 当拷贝二维数组时,它相当于一个一维数组的每一项又存一个一维数组的首地址引用,那么单纯对二维数组使用array就没有用了,要达到目的只有把它细分到不是引用值(比如你原来是对b拷贝,现在改成对b[0],b[1]...分别拷贝),再使用这个方法。
㈤ java多维数组怎么复制
网上有这样的一个例子
程序如下:
class C{
public static void main(String args[]){
int a[][] = {{1,2,3},{4,5,6}};
int b[][] = new int[a.length][a[0].length];
System.array(a,0,b,0,a.length); //通过array()函数拷贝数组
b[0][0] = 4; //改变数组b[0][0]的值
System.out.println("a[][]");
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
System.out.println("b[][]");
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
打印的结果如下:
a[][]
4 2 3
4 5 6
b[][]
4 2 3
4 5 6
而如果把上述程序中的二维数组改为一维数组,结果却不同。程序如下:
class C{
public static void main(String args[]){
int a[] = {1,2,3};
int b[] = new int[a.length];
System.array(a,0,b,0,a.length); //通过array()函数拷贝数组
b[0] = 4; //改变数组b[0]的值
System.out.println("a[]:");
for(int i=0;i<3;i++){
System.out.print(a[i] + " ");
}
System.out.println();
System.out.println("b[]:");
for(int i=0;i<3;i++){
System.out.print(b[i] + " ");
}
}
}
打印结果如下:
a[]:
1 2 3
b[]:
4 2 3
在第一个程序中,用b[0][0] = 4;只改变了数组b[0][0]的值,可是结果却是数组a[0][0]的值也发生了改变。而在第二个程序中,由于是一个一维数组,改变了b[0]的 值,a[0]的值却并没有受到影响,所以问题可能就出在数组的维数上。第一个程序中的a 是一个数组的数组(java 中没有多维数组的概念,只有数组的数组),同理b 也是,那么a 含有两个元素,第一个是指向(1,2,3) 这个数组的引用,第二个是指向(4,5,6)这个数组的引用,而arrayCopy 就是负责把数组的内容 过去的,因此 a 的内容 (2 个引用) 被 到b 中去了,因此你对b[0][0] 做修改,a 也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.array方法
注意:
1.上面方法中array效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 array对二维数组进行复制时,是浅拷贝, 即
Object[][] aa;
Object[][] bb = aa.clone();
//or bb=System.array(aa,0,bb, 0, bb.length);
则:
boolean b1 = ( aa[i] == bb[i] ); //false
boolean b2 = (aa[i][j] == bb[i][j]); //true, 可见数组元素只复制了引用。新旧数组指向相同的内存地址,(不论对象数组,还是基本类型数组)。
/**
* 数组的浅拷贝是指数组拷贝时,只拷贝了数组的地址,新旧数组指向同一数据
* 数组的深拷贝,不论数据是基本类型,还是对象类型,都是一样的。
* 对数组来说,不一样的地方在于,当为数组元素赋值时,基本类型值传递,对象类型是引用传递。
*
*/
Object[] a = new Object[]{"String", new Integer(1)};
Object[] b = a;
/**
* 数组深拷贝的方法有如下几种:
* 1。 调用clone
* 2。 调用System.array
* 以上两种对基
㈥ java中二维数组怎么复制
/** * @Title: ArrayCopy.java * @Package com.sd.coding * @Description: TODO * @author Administrator * @date 2015-6-29 上午9:26:11 * @version V1.0 */package com.sd.coding; /** * @ClassName: ArrayCopy * @Description: TODO * @author Administrator * @date 2015-6-29 上午9:26:11 * 备注: */public class ArrayCopy { /** * @Title: main * @Description: TODO * @author sd * @date 2015-6-29 上午9:26:12 * @param args * @throws */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayCopy arrayCopy = new ArrayCopy(); String[][] strArray=new String[][]{ {"a","b","c"}, {"A","B","C","D"}, {"1","2"} }; String[][] Array = arrayCopy.Array2(strArray); ArrayCopy.printArray(Array); } //打印数组 public static void printArray(String[][] array){ for(int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ System.out.print(array[i][j]+" "); } System.out.println(); } } //使用循环语句遍历复制 public String[][] Array1(String[][] array){ String[][] Array=new String[array.length][]; for(int i=0;i<array.length;i++){ Array[i]=new String[array[i].length]; for(int j=0;j<array[i].length;j++){ Array[i][j]=array[i][j]; } } return Array; } //使用java.lang.System.array()方法复制(推荐使用) public String[][] Array2(String[][] array){ String[][] Array=new String[array.length][]; for(int i=0;i<array.length;i++){ Array[i]=new String[array[i].length]; System.array(array[i], 0, array[i], 0, Array[i].length); } return array; }}
㈦ java复制数组数据到其他数组
不用这么麻烦吧。。。把原先的数据,循环拼接到新数组就行了吧
㈧ Java 如何拷贝数组的数据
这就是从指定的源数组复制一个数组到目的数组,复制是从指定位置开始到目标数组指定位置结束,
也就是从你的第一个数组0
index开始复制长度为3复制到目标的0开始前3位
简单说system.array(a1,0,a2,0,3);
a1是你的原数组就是要提供复制的,0是你的原数组的开始位数,
也就是a1的index,a2是目的数组,就是需要复制到的,0是a2的开始位数吗,也就是a2的index,3是复制的长度
㈨ JAVA如何将数组复制到另一个表中
E[]data ------ oldArray E[]temp ------ newArray ( but empty) for ( int 1 =0; i<data.size(); i++)temp[i] = data[i] ; // over; or JAVA API Collection Interface ( toArray method) !!! toArray<T> T[] toArray(T[] a) Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array. If the collection fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this collection. If this collection fits in the specified array with room to spare (i.e., the array has more elements than this collection), the element in the array immediately following the end of the collection is set to null. This is useful in determining the length of this collection only if the caller knows that this collection does not contain any null elements.) If this collection makes any guarantees as to what order its elements are returned by its iterator, this method must return the elements in the same order. Like the toArray method, this method acts as bridge between array-based and collection-based APIs. Further, this method allows precise control over the runtime type of the output array, and may, under certain circumstances, be used to save allocation costs Suppose l is a List known to contain only strings. The following code can be used to mp the list into a newly allocated array of String: String[] x = (String[]) v.toArray(new String[0]); Note that toArray(new Object[0]) is identical in function to toArray(). </dd>Parameters: a - the array into which the elements of this collection are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose. Returns: an array containing the elements of this collection Throws: ArrayStoreException - the runtime type of the specified array is not a supertype of the runtime type of every element in this collection. NullPointerException - if the specified array is null.</dd>