1. 程式人生 > >Java 基礎之(十一)一維陣列(補充)

Java 基礎之(十一)一維陣列(補充)

陣列的複製

在程式中,經常需要複製一個數組或一個數組的一部分。這種情況下可能要去嘗試用賦值語句(=),如下所示:

int[] a = {1,3,5,7};
int[] b = new int[5];
b = a;

該語句並不能將a引用的陣列內容複製給b,而只是將a的引用值複製給了b。在賦值語句之後,a和b都將指向同一個陣列,即a引用所指向的陣列。b原本指向的陣列不能再被引用,就變成了垃圾,將被系統回收。

在Java中國,複製陣列有三種方法:

  • 使用迴圈語句逐個複製陣列中的元素
  • 使用System類中的靜態方法arraycopy
  • 使用clone方法複製陣列

1)可以使用迴圈將原陣列中的每個元素複製到目標陣列中的對應元素。例如,下述程式碼將使用for迴圈將sourceArray賦值給targetArray:

public class TestTwo {

    public static void main(String[] args){
        int[] sourceArray = {1,3,5,7,9};
        int[] targetArray = new int[sourceArray.length];

        for(int i = 0;i<sourceArray.length;i++){
            targetArray[i] = sourceArray[i];
            System.out.print(" "+targetArray[i]);
        }

    }

}
輸出結果:
 1 3 5 7 9

2)使用System類中的靜態方法arraycopy複製陣列。arraycopy的語法格式如下:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
引數解釋:
    src - 源陣列.
    srcPos - 在原陣列中的起始位置.
    dest - 目標陣列.
    destPos - 目標陣列的起始位置.
    length
- 複製的陣列元素個數.

例如,以下程式碼是將源陣列的前三個元素複製給目標陣列的後三個元素:

public class TestTwo {

    public static void main(String[] args){
        int[] sourceArray = {1,3,5,7,9};
        int[] targetArray = new int[sourceArray.length];

        System.arraycopy(sourceArray, 0, targetArray, 2, 3);
        System.out.print(Arrays.toString(targetArray));

    }

}
輸出結果:
[0, 0, 1, 3, 5]

給方法傳遞陣列

陣列可以作為引數傳遞給方法。例如,下面的例子就是一個列印int陣列中元素的方法。

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
  }
}

下面例子呼叫printArray方法打印出 3,1,2,6,4和2:

printArray(new int[]{3, 1, 2, 6, 4, 2});

陣列作為函式的返回值

方法也可以返回一個數組。例如下面的方法返回一個與原陣列順序相反的陣列:

public class TestTwo {
    public static void main(String[] args){
        int[] list = {1,3,5,7,9};

        int[] list2 = reverse(list);
        System.out.print(Arrays.toString(list2));
    }

    private static int[] reverse(int[] list) {
        // TODO Auto-generated method stub
        int[] result = new int[list.length];
        for(int i = 0,j = result.length-1;i<list.length;i++,j--){
            result[j] = list[i];

        }
        return result;
    }
}
輸出結果:
[9, 7, 5, 3, 1]

可變長引數列表

可以把型別相同但個數可變的引數傳給方法。方法中的引數宣告如下:

typeName...parameterName(型別名...引數名)

在方法宣告中,指定型別後緊跟著省略號(…)。只能給方法中指定一個可變長引數,同時該引數必須是最後一個引數。
Java將可變長引數當成陣列對待。可以將一個數組或可變的引數個數傳遞給可變長引數。當用可變的引數個數呼叫方法時,Java會建立一個數組並把引數傳給它。下列程式將打印出個數不定的數列中的最大值:

printMax(34,3,3,2,56.5);
printMax(new double[]{1,2,3});
private static void printMax(double...numbers) {
        // TODO Auto-generated method stub
        if(numbers.length == 0){
            System.out.print("No argument passed");
            return;
        }
        double result = numbers[0];
        for(int i = 1;i < numbers.length;i++){
            if(numbers[i] > result){
                result = numbers[i];
            }
        }
        System.out.println("The max value is" + result);
    }
輸出結果:
The max value is 56.5
The max value is 3.0

Arrays類

為實現陣列的排序和查詢、陣列的比較和對陣列填充元素,java.util.Arrays包括各種各樣的靜態方法。具有以下功能:

  • 給陣列賦值:通過fill方法。
  • 對陣列排序:通過sort方法,按升序。
  • 比較陣列:通過equals方法比較陣列中元素值是否相等。
  • 查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分查詢法操作。

具體說明請查看下錶:
這裡寫圖片描述

  1. 使用sort方法自動升序排序
    呼叫sort(list)對整個陣列進行排序。
int[] list = {10,1,9,2,6,-5};
Arrays.sort(list);
System.out.print(Arrays.toString(list));
輸出結果:
[-5,1,2,6,9,10]

呼叫sort(chars,1,5)對從chars[1]到chars[5-1]的部分陣列排序。

char[] chars = {'d','b','z','x','y','i'};
Arrays.sort(chars,1,5);
System.out.print(Arrays.toString(chars));
輸出結果:
[d, b, x, y, z, i]
  1. 使用二分查詢法(binarySearch方法)在陣列中查詢關鍵字。

陣列必須提前按增序排列好。返回的值是關鍵字所對應的下標。

int[] list = {-5,1,4,5,8,9,10};
System.out.print("the index of key is "+ Arrays.binarySearch(list, 8));
輸出結果:
the index of key is 4
char[] chars = {'b','d','i','x','y','z'};
System.out.print("the index of key is "+ Arrays.binarySearch(chars, 'i'));
輸出結果:
the index of key is 2
  1. 使用equals方法檢測兩個陣列是否相等。在下面的程式碼中,list1和list2相等,list2和list3不相等。
int[] list1 = {1,3,5,7,9};
int[] list2 = {1,3,5,7,9};
int[] list3 = {2,4,6,8,10};
System.out.println(Arrays.equals(list1, list2));
System.out.print(Arrays.equals(list2, list3));
輸出結果:
true
false
  1. 使用fill方法填充整個陣列或部分陣列。
    例如,下面程式碼將5填充到list1中,將8填充到list3[1]和list3[3-1]中。
int[] list1 = {1,3,5,7,9};
int[] list3 = {2,4,6,8,10};
Arrays.fill(list1, 5);
Arrays.fill(list3, 1, 3, 8);
System.out.println(Arrays.toString(list1));
System.out.println(Arrays.toString(list3));
輸出結果:
[5, 5, 5, 5, 5]
[2, 8, 8, 8, 10]