|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 零度非安全 于 2017-4-10 23:32 编辑
【Java 教程(原创)】索引帖
是不是觉得看完上一讲不过瘾,在开始聊数组的复制之前,先说下数组的表示格式。
学习过 C 语言或其他语言的鱼油,一定非常熟悉使用循环输出数组元素的值。在这里介绍 JDK1.5 版本以后提供的一个简单的输出数组元素的值的方法。让 Arrays 类调用 public static String toString(int[] a) 方法,可以得到参数指定的一维数组 a 的如下格式的字符串表示:[a[0],a[1],a[2],......,a[a.length - 1]]
例如,对于数组:
Arrays.toString(a) 得到的字符串是:
注:有关使用类调用方法的知识会在以后讲到。
数组的复制
通过上集的学习,我们已经知道,数组属于引用类型。也就是说,如果两个类型相同的数组具有相同的引用,那么它们就有完全相同的内存单元。例如,对于:如果执行:那么 a 和 b 的值就相同,即 a 的引用与 b 的引用相同。这样,a[0] 和 b[0] 是相同的内存空间,同样,a[1] 和 b[1] 也是相同的内存空间。
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值的改变不会影响到原数组元素的值,反之也是如此。如果想实现这样的目的,显然不能使用数组引用赋值的方法。
1> arraycopy 方法
一个方法就是利用循环把一个数组的元素的值赋值给另一个数组中的元素(C 语言中经常使用的方法)。在这里介绍 Java 提供的更简练的数组之间的快速复制,即让 System 类调用方法:public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
可以将数组 sourceArray 从索引 index1 开始的 length 个元素中的数据复制到数组 copyArray 中,即将数组 sourceArray 中的索引值从 index1 到 index1 + length - 1 元素中的数据复制到数组 copyArray 的某些元素中,copyArray 数组从 index2 元素开始存放这些数据。如果数组 copyArray 不能存放下复制的数据,程序运行将发生异常。
下面这个例子演示了 arraycopy 方法,运行效果如下图所示:
例子代码如下:
arrayCopyUse.javaimport java.util.Arrays;
public class arrayCopyUse{
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};
System.arraycopy(a,0,b,0,a.length);
System.arraycopy(c,2,d,2,c.length - 3);
System.out.println("数组a的各个元素中的值:");
System.out.println(Arrays.toString(a));
System.out.println("数组b的各个元素中的值:");
System.out.println(Arrays.toString(b));
System.out.println("数组c的各个元素中的值:");
System.out.println(Arrays.toString(c));
System.out.println("数组d的各个元素中的值:");
System.out.println(Arrays.toString(d));
}
}
2> copyOf 和 copyOfRange 方法
前面介绍的方法public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
有一个缺点,那就是事先必须创建参数 copyArray 指定的数组。JDK1.6 版本以后,Java 又提供了 copyOf 和 copyOfRange 方法。例如,Arrays 类调用方法:public static double[] copyOf(double[] original,int newLength)
可以把参数 original 指定的数组中从索引 0 开始的 newLength 个元素复制到一个新数组中,并返回这个新数组,且该新数组的长度为 newLength。如果 newLength 的值大于 original 的长度,copyOf 方法返回的新数组的第 newLength 索引后的元素取默认值。类似的方法还有:public static float[] copyOf(float[] original,int newLength)
public static int[] copyOf(int[] original,int newLength)
public static char[] copyOf(char[] original,int newLength)等
例如,对于:int[] a = {100,200,300,400};
int[] b = Arrays.copyOf(a,5);
那么 b[0] = 100,b[1] = 200,b[2] = 300,b[3] = 400,b[4] = 0。即 b 的长度为 5,最后一个元素 b[4] 取默认值 0。
另外,还有一个方法,可以把数组中部分元素的值复制到另一个数组中,例如:public static double[] copyOfRange(double[] original,int from,int to)
这个方法可以把参数 original 指定的数组中从索引 from 至 to - 1 的元素复制到一个新数组中,并返回这个新数组,即新数组的长度为 to - from。如果 to 的值大于数组 original 的长度,新数组的第 original.length - from 索引开始的元素取默认值。类似的方法还有:public static float[] copyOfRange(float[] original,int from,int to)
public static int[] copyOfRange(int[] original,int from,int to)
public static char[] copyOfRange(char[] original,int from,int to)等
例如,对于:int[] a = {100,200,300,400,500,600};
int[] b = Arrays.copyOfRange(a,2,5);
那么数组 b 的长度为 3,b[0] = 300,b[1] = 400,b[2] = 500。
下面这个例子使用 copyOf 和 copyOfRange 方法复制数组,运行效果如下图所示:
例子代码如下:
copyOf_RangeUse.javaimport java.util.*;
public class copyOf_RangeUse{
public static void main(String args[]){
int[] a = {10,20,30,40,50,60},b,c,d;
b = Arrays.copyOf(a,10);
System.out.println("数组a的各个元素中的值:");
System.out.println(Arrays.toString(a));
System.out.println("数组b的各个元素中的值:");
System.out.println(Arrays.toString(b));
c = Arrays.copyOfRange(a,3,5);
System.out.println("数组c的各个元素中的值:");
System.out.println(Arrays.toString(c));
d = Arrays.copyOfRange(a,3,9);
System.out.println("数组d的各个元素中的值:");
System.out.println(Arrays.toString(d));
}
}
【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。
彩蛋
|
|