数组的引用
数组属于引用型变量。因此,若是两个相同类型的数组具有相同的引用,它们就有完全相同的元素。
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] a={1,2,3}; 9 int[] b={4,5,6}; 10 a=b; 11 System.out.println(Arrays.toString(a)); 12 System.out.println(Arrays.toString(b)); 13 } 14 }
PS:如果要使用数组a=数组b的赋值语句,数组a和数组b的类型必须相同。
数组的基本使用
- length
数组的元素的个数称为数组的长度。对于一维数组,“数组名字.length”的值就是数组中元素的个数;
对于二维数组,“数组名字.length”的值就是它含有一维数组的个数;
例如:
float a[] = new float[8];
int b[][] = new int[5][6];
a.length的值是8,b.length的值是5。
- equals
指示某个对象是否与其他对象“相等”,与“==”效果一样,返回值是loolean类型。
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] a={1,2,3}; 9 int[] b={4,5,6}; 10 int[] c={1,2,3}; 11 System.out.println(a==b); 12 System.out.println("a和b相等吗?"+Arrays.equals(a,b)+a.equals(b)); 13 System.out.println("a和c相等吗?"+"Arrays:"+Arrays.equals(a,c)+"-----x.equals():"+a.equals(c)); 14 b=a; 15 System.out.println(a==b); 16 System.out.println("a和b相等吗?"+Arrays.equals(a,b)+a.equals(b)); 17 } 18 }
PS:从以上代码比较得知,Arrays.equals() 比较的是两个数组是否具有完全相同的数组元素值。而 a.equeals(b) 方法比较的是两个数组的是否具有完全相同的内存单元。
为了进一步验证这个结论,我写了以下代码。
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] a=null; 9 System.out.println(Arrays.equals(a, null)); 10 } 11 }
数组的复制
- 复制引用和复制对象
复制引用:如文章开头所说,数组a=数组b 这样的赋值语句就是复制引用。这样的作用就是a的引用与b的引用相同,也就是a和b是相同的内存空间。
但有时想让后者元素值的改变不会影响到原数组元素的值,或前者元素值的改变不会影响到后者数组元素的值。以下的方法都能做到。
复制对象:将源对象整个复制,对象副本和源对象的内存空间并不同,两者的值改变也不会互相影响。
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] testA = {1,2,3}; 9 System.out.println("testA的地址:"+testA); 10 int[] testB = testA; 11 System.out.println("testB的地址:"+testB); 12 int[] testC = testA.clone(); 13 System.out.println("testC的地址:"+testC); 14 testB[1]=5; 15 System.out.println("testA的元素:"+Arrays.toString(testA)); 16 System.out.println("testB的元素:"+Arrays.toString(testB)); 17 } 18 }
- arraycopy方法
该方法是Java提供的数组之间的快速复制,即让System类调用方法:
System.arraycopy(sourceArray , int index1 , copyArray , int index2 , int length);
具体是怎么用的呢?
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] testA = {1,2,3,4,5,6}; 9 int[] testB = {7,7,7}; 10 System.arraycopy(testB, 0, testA, 2, testB.length);//从testB[0]开始,复制testB.length个元素到testA[2]开始的内存单元 11 System.out.println(Arrays.toString(testA)); 12 } 13 }
需要注意的是:如果sourceArray数组的索引值大于数组长度,或copyArray数组不能存放下复制的数据,程序运行将发生异常。
- copyOf和copf和copyOfRange方法
arraycopy方法有一个缺点,就是事先必须创建参数copyArray指定的数组。JDK1.6版本后,Java提供了copyOf和copyOfRang方法。
Arrays类调用方法:
Arrays.copyOf(int[] original , int newLength);
Arrays.copyOfRange(int[] original , int from , int to);
具体用法:
1 /** 2 这是数组的测试类 3 **/ 4 import java.util.Arrays; 5 6 public class ArrayTest{ 7 public static void main(String arg[]){ 8 int[] testA = {1,2,3,4,5,6}; 9 //声明并创建testB数组,长度为10,并把testA[0]开始的值复制给testB数组,余下补0。 10 int[] testB = Arrays.copyOf(testA,10); 11 System.out.println(Arrays.toString(testB)); 12 13 //声明并创建testC数组,长度为5-2,并把testA数组的值从testA[3]到testA[5]复制给testB数组。 14 int[] testC = Arrays.copyOfRange(testA,2,5); 15 System.out.println(Arrays.toString(testC)); 16 } 17 }
需要注意的是:copyOf方法中newLength值不能小于original数组的长度,copyOfRange方法中索引from和to的值不能超出original数组的长度,否则程序运行会发生异常。