参考书籍:Java面向对象程序设计(第二版)--耿祥义 张跃平编著
我们知道数组属于引用类型,也就是说,如果两个类型相同的数组具有相同的引用,那么他们就有完全相同的内存单元
例如:
int a[]={1,2},b[];
如果执行b=a
那么a和b的值就相同,即a的引用和b的引用相同,这样
a[0]和b[0]是相同的内存空间,a[1]和b[1]是相同的内存空间
如果我们想把一个数组的元素复制到另外一个数组中,后者元素值的改变不会影响原数组元素的值,反之亦然,这样很明显不能用数组引用赋值的方法
一个方法是用循环(C语言常用)
在下面介绍Java提供的数组之间快速复制,即让System类调用方法
- arraycopy方法
public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
快速记忆(这个数组,第几索引 , 要变的数组,第几索引 , 长度)
例子:
package p1;
import java.util.Arrays;
public class p1 {
public static void main(String args[]) {
char[] a = {'a', 'b', 'c', 'd', 'e', 'f'}, b = {'1', '2', '3', '4', '5', '6'};
int []c ={1,2,3,4,5,6},d={10,20,30,40,50,60};
int []e ={1,2,3,4,5,6},f={10,20,30,40,50,60};
System.arraycopy(a,0,b,0,a.length); //System类调用方法
//(数组a索引为0开始,复制到数组b索引从0开始,长度为6)
System.out.println(Arrays.toString(b));
System.arraycopy(c,2,d,2,c.length-3); //6-3=3,长度为3
//(数组c索引为2开始,复制到数组d索引从2开始,长度为3)
System.out.println(Arrays.toString(d));
/* System.arraycopy(e,1,f,3,4); 错误,超过了目的数组的长度
System.out.println(Arrays.toString(f));*/
}//如果没有超过,原来有值为原值,没有就补0
}
输出结果:
[a, b, c, d, e, f]
[10, 20, 3, 4, 5, 60]
- copyOf和copyOfRange方法
前面的方法有个缺点,就是要事先要创建参数copyArray指定的数组。
Jdk1.6版本后,又提供了两个方法,copyOf和copyOfRange方法
,Arrays类调用方法
1》public static double []copyof(double []original,int newLength)
快速记忆(原数组索引0开始,新数组长度),并返回新数组
注意:如果如果newLength(即新数组长度)大于original(即原数组),新数组其后元素取默认值
类似的方法还有
public static int []copyof(int []original,int newLength)
public static char []copyof(char []original,int newLength)
public static float []copyof(float []original,int newLength)
例子:
int a[]={100,200,300,400};
Int []b=Arrays.copyOf(a,5);
即b的数组为[100,200,300,400,0] 最后一个补默认值,int是0
2》public static double []copyOfRange(double []original,int from,int to)
把数组中部分元素的值复制到另外一个数组中
快速记忆(原数组,开始索引即from,结束索引即to-1),并返回新数组,新数组长度是to-from
注意,如果to的值大于original(即原数组)的长度,新数组的第original.length-from索引开始的元素取默认值
类似方法和前面一样
例子:
int a[]={100,200,300,400,500,600};
Int []b=Arrays.copyOfRange(a,2,5);
即b的数组为[300,400,500]
看得时候可以索引2开始,5-2=3个
或者这样看索引2开始,到索引5-1=4