我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的
public static void main(String[] args) { int[] arry1 = new int[]{1, 2, 3, 4}; //数组赋值 int[] arry2 = arry1; //一个数组对象,两个引用同时引用该对象 System.out.println(arry1[1]); System.out.println(arry2[1]); arry1[1] = 8; System.out.println(arry2[1]); }
这样并不能复制数组只是一个简单的赋值操作,下面我们采取另一种方式试一下。
public static void main(String[] args) { int[] arry1 = new int[]{1, 2, 3, 4}; int[] arry3 =new int[arry1.length]; for(int i=0; i<arry1.length; i++){ arry3[i] = arry1[i]; } arry3[1] = 9999; System.out.println(arry1[1]); }
其实这个Java API中已经提供了一个非常简便并且效率比较高的方法System.arraycopy(src, srcPos, dest, destPos, length),这个方法的底层是用C++写的,比上面的那种for循环实现拷贝效率要高的多。 JDK 1.6以上提供了Arrays.copyOf(src, length)方法,其实这个方法的底层也是arraycopy方法实现的。
public static void main(String[] args) { int[] src = {1, 2, 3, 4}; int[] dest = new int[4]; System.arraycopy(src, 0, dest, 0, src.length); System.out.println(Arrays.toString(dest)); }
public static void main(String[] args) { int[] src = {1, 2, 3, 4}; int[] dest = Arrays.copyOf(src, src.length); System.out.println(Arrays.toString(dest)); }
System.arraycopy()可以复制数组
Arrays.copyOf()可以简便的创建数组副本
public static void main(String[] args) { char[] cArr = {'大', '碗'}; char[] temp = Arrays.copyOf(cArr, 4); temp[2] = '干'; temp[3] = '拌'; System.out.println(Arrays.toString(temp)); }
package com.dawanganban.test; import java.util.Arrays; public class ArrayCopyTest { public static void main(String[] args) { String str = "统计一个字符在字符串中的所有位置"; int[] ary = countAll(str, '字'); System.out.println(Arrays.toString(ary)); } /** * 统计一个字符在字符串中的所有位置的方法 * @param str 被统计的字符串 * @param ch 统计的字符 * @return 位置数组 */ private static int[] countAll(String str, char ch){ int[] ary = {}; for(int i=0; i<str.length(); i++){ char c = str.charAt(i); if(c == ch){ ary = Arrays.copyOf(ary, ary.length + 1); ary[ary.length - 1] = i; } } return ary; } }