- 浏览: 74760 次
- 性别:
- 来自: 温州
最新评论
-
panjunke2012:
非常不错 本人都测试过
Java List遍历方法 及其效率对比 -
zhangyan19870108:
<pre name="code" c ...
System.arraycopy -
ih0qtq:
我的结果: One:5574Two:5137Three:510 ...
Java List遍历方法 及其效率对比 -
ih0qtq:
...
System.arraycopy -
ih0qtq:
length
System.arraycopy
程序如下:
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.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
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.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
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 就是负责把数组的内容copy 过去的,因此 a 的内容 (2 个引用) 被copy 到b 中去了,因此你对b[0][0] 做修改,a 也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.arraycopy方法
注意:
1.上面方法中arraycopy效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 arraycopy对二维数组进行复制时,是浅拷贝, 即
Object[][] aa;
Object[][] bb = aa.clone();
//or bb=System.arraycopy(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.arraycopy
* 以上两种对基本类型和对象类型数据效果等同。
* 3。 使用FOR循环,将数组的每个元素复制。(注意调用clone方法)
*
*/
/*
* 当数组数据是基本类型时,
*/
// int[] array = new int[]{0,1,2,3,4};
// int[] copy = array.clone(); //1.拷贝数据
// System.out.println( copy.equals(array));
// System.out.println( copy == array );
// for (int i = 0; i < copy.length; i++) {
// System.out.print( copy[i]+", " );
// copy[i]++; //2.改变新数组数据内容
// System.out.print( copy[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.arraycopy(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.arraycopy(aa, 0, bb, 0, aa.length);
// Object[][] bb = aa.clone();
//// Object[][] bb = new Object[3][3];
//// System.arraycopy(aa, 0, bb, 0, aa.length); //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
/**
* 二维数组的深拷贝的实现方式!!! 转为一维数组拷贝。
*/
// for (int i = 0; i < bb.length; i++) { //实现深拷贝的方法!!!!!!!!!!!!
// System.arraycopy(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对象
用了范型,需要强制类型转换了吧
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.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
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.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
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 就是负责把数组的内容copy 过去的,因此 a 的内容 (2 个引用) 被copy 到b 中去了,因此你对b[0][0] 做修改,a 也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.arraycopy方法
注意:
1.上面方法中arraycopy效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 arraycopy对二维数组进行复制时,是浅拷贝, 即
Object[][] aa;
Object[][] bb = aa.clone();
//or bb=System.arraycopy(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.arraycopy
* 以上两种对基本类型和对象类型数据效果等同。
* 3。 使用FOR循环,将数组的每个元素复制。(注意调用clone方法)
*
*/
/*
* 当数组数据是基本类型时,
*/
// int[] array = new int[]{0,1,2,3,4};
// int[] copy = array.clone(); //1.拷贝数据
// System.out.println( copy.equals(array));
// System.out.println( copy == array );
// for (int i = 0; i < copy.length; i++) {
// System.out.print( copy[i]+", " );
// copy[i]++; //2.改变新数组数据内容
// System.out.print( copy[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.arraycopy(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.arraycopy(aa, 0, bb, 0, aa.length);
// Object[][] bb = aa.clone();
//// Object[][] bb = new Object[3][3];
//// System.arraycopy(aa, 0, bb, 0, aa.length); //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
/**
* 二维数组的深拷贝的实现方式!!! 转为一维数组拷贝。
*/
// for (int i = 0; i < bb.length; i++) { //实现深拷贝的方法!!!!!!!!!!!!
// System.arraycopy(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对象
评论
4 楼
zhangyan19870108
2013-11-05
(String[][]) bodyDataList.toArray(new String[bodyDataList.size()][]);这样就能转成功,还一直不清楚toArray(x)x里面的东西,因为java里面只有array对象
用了范型,需要强制类型转换了吧
3 楼
ih0qtq
2012-07-13
2 楼
ih0qtq
2012-07-13
length
1 楼
rongge2
2010-06-01
arraycopy如果是一维数组,对象类型也是浅拷贝。楼主把数组类型改为StringBuffer看看结果,就会明白了。
/* * 当数组数据是对象类型时, */ // 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.arraycopy(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(); /**
发表评论
-
jsp标签 学习 (一)
2010-01-08 20:15 1037简单的页面 完成提交用户名的请求 <%@ page ... -
Java List遍历方法 及其效率对比
2009-12-06 22:46 35532我的结果: One:14109 Two:14000 Thre ... -
JAVA中的数据类型间的转换
2009-11-29 18:37 1917Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中 ... -
关于代码风格
2009-11-14 22:42 1006要尽量使类的分工明确,每个方法中的代码最好不要超过40行(一屏 ... -
JAVA IO中的mark reset
2009-10-20 20:55 2135mark就像书签一样,在这个BufferedReader对应的 ... -
关于数据更新
2009-10-20 20:15 1087先复制GuPiao2.txt (更新后的数据)的内容到GuPi ... -
正则表达式30分钟入门教程
2009-09-24 21:52 520原文地址 http://unibetter.com/deerc ... -
网页数据抓取 获取股票数据
2009-09-24 21:48 4764/* * import java.io.Buffere ... -
本地 白云机场 数据抓取
2009-09-24 21:46 1138/* * import java.io.Buffere ... -
正则表达式 雏形1.
2009-09-24 21:45 909/* * import java.io.Buffere ... -
接口详解()
2009-08-20 20:07 821接口是把隐式公共方法 ... -
基类和接口
2009-08-20 20:04 1408接口在java编程中有极大的作用,对团队来说,更是不可或缺的部 ... -
prime【】素数读取
2009-08-16 21:15 1112求质数的文章: [原创]求 ... -
HDU 解题报告
2009-07-18 14:23 1006HDU 2000-2099 解题报告 -
翻译(45-60)__Java程序员认证模拟题
2009-07-17 21:57 769翻译(45-60)__Java程序员认证模拟题
相关推荐
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。
使用System.arraycopy()实现数组之间的复制
个人研究所得,包含对其内部jdk源码的分析。 同时会结合ArrayList中对该两个方法的调用做进一步说明。...总结一句话:在允许的情况下,尽量调用System.arraycopy方法,实在不行再调用Arrays.copyOf方法。
System.arraycopy(writeStringToBytes, i*tempLength, temp, 0, writeStringToBytes.length%tempLength); ops.write(new String(temp,"GBK").trim().getBytes(),0,writeStringToBytes.length%tempLength);...
System.arraycopy(ia,0,ib,0,3); // 复制源数组中从下标0开始的3个元素到目的数组,从下标0的位置开始存储。 for(int i=0;i<ia.length;i++) System.out.print(ia[i]); System.out.println(); for(int j=0;...
/** * 动态调整数组的长度 */ public class AdjustArrayLength { private static int DEFAULT_LENGTH = 10; public static Integer... System.arraycopy(src, 0, result, 0, src.length); return result; }
System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length); currentIndex += arrays[i].length; } return result; } public static byte[] getCurrentDateAsByteArray( String sFormat ) { ...
System.arraycopy(num, 0, ch, ch.length-num.length, num.length); String ball = new String(ch); red[i] = ball; } String[] blue = ("01,02,03,04,05,06,07," + "08,09,10,11,12,13,14,15,16").split(",...
数组拷贝,建议使用System.arraycopy()速度更快,把source数据内容拷贝到destination中使用Object则支持多种对象数组;去除数组中的重复元素;四舍五入;判断字符串是否是小数;半角数字的unicode范围;取得ascii码;
● 复制数组:使用System.arraycopy()方法或Arrays.copyOf()方法将一个数组复制到另一个数组中。 ● 排序数组:使用Arrays.sort()方法对数组进行排序。 ● 搜索数组:使用Arrays.binarySearch()方法在一个已排序的...
目录一、深拷贝与浅拷贝解析浅拷贝深拷贝二、数组拷贝的方式1.for循环来拷贝2.System.arraycopy( )拷贝3.Arrays.copyOf( )拷贝4.clone( )拷贝5.解释三、四种拷贝方式效率比较1. System.arraycopy( )2.Arrays.copyOf...
编写一个类MyArray,包含一个复制数组的方法,功能与System.arraycopy()相同。请使用泛型改写MyArray类实现数组复制. 请编写程序。首先在程序中定义一个枚举类型,它含有7个枚举常量,分别表示一个星期每一天的名称...
90行Java代码实现小巧俄罗斯方块~~ 66行改为: System.arraycopy(matrix[j-1],0,matrix[j],0,10); 修改的一个Bug 最新版本在:http://wireless.javaeye.com/blog/595321
基本数据类型的包装类 •八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。 把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个...
数组的复制:System.arraycopy(src, srcPos, dest, destPos, length); Arrays.copyOf(original, newLength); 数组的排序:排序方法和排序分类 Arrays.sort(arr);//对arr进行升序排列 2.方法(函数、过程): ...
System.arraycopy(blockdb, 0, tmpdb, 0, BlockSize);// raf.seek( (util.getBlockSize() + 4) * BlockIndex); //(+4)是用于存放文件大小信息的 //文件块写入临时文件中将相应数据块放到相应的位置中去 raf....
Java数组扩容的原理 1)Java数组对象的大小是固定... 3)System.arraycopy()可以复制数组。 4)Arrays.copyOf()可以简便的创建数组副本。 5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容。
System.arraycopy方法4. Arrays.copyOfRange方法 1. 直接赋值 在java中,我们可以将一个数组变量直接拷贝给另一个数组变量。但拷贝后,两个数组变量引用的是同一个数组。若改变其中一个数组中的内容,另一个数组也...
import java .util.*; public class SystemTest { public static void ... System.out.println(System.arraycopy); int[] dst = new int[src.length]; System.arraycopy(src, 0, dst
b) System.arraycopy()方法 c) Arrays.copyOf()方法 d) 使用clone()方法 e) Arrays.copyOfRange()方法 接下来,我们看下这几种方法的效率和源码,以及如何使用序列化和反序列化实现组合类的深复制。 我们以百万级和...