读书笔记——数组的基础使用

数组的引用

   数组属于引用型变量。因此,若是两个相同类型的数组具有相同的引用,它们就有完全相同的元素。

 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数组的长度,否则程序运行会发生异常。

posted @ 2018-06-25 22:10  留住思绪  阅读(213)  评论(0编辑  收藏  举报