1. 程式人生 > >第四天 一維數組初步學習

第四天 一維數組初步學習

lar 名稱 分享圖片 整數 .com arraycopy 元素 static some

什麽是數組:

  • 數組是一種數據結構,用來存儲同一類型值的集合.

  • 具體的來說,將有限個類型相同的變量的集合命名,這個名稱就是數組.組成數組的各個變量稱為數組的分量,也叫數組的元素.用於區分數組的各個元素的元素的數字編號稱為下表.


數組的特點:

  • 數組是相同數據類型的元素集合.

  • 數組中的個元素的存儲是有先後順序的,他們在內存中按先後順序連續存放在一起.

好處:


可能會看到這樣的數組:

比如說一個 int 類型的數組:

int[] arr = { 'a', 25, 45, 78, 'z' };
System.out.println(Arrays.toString(arr));


輸出結果是:[97, 25, 45, 78, 122]

存放進去的 char 類型的字符會自動轉為 int 類型的 ASCII 碼。

上面的代碼中就將 a 轉成了 97,z 轉成了 122。

所以數組只能存放同一類型的數據。


數組的聲明:

聲明有兩種方式:

方式一:

dataType[] arrayRefVar; // 首選的方法

方式二:

dataType arrayRefVar[]; // 效果相同,但不是首選方法

示例:

int[] a;

int a[];

建議使用第一種方式,因為他將類型int[](整數型數組)與變量名發呢個開了.


數組的創建:

JAVA中使用new關鍵字來創建數組.

arrayRefVar = new dataType[arraySize]; //例如 a = new int[1];

聲明和創建可以在一條語句中完成. []中為數組的長度.

dataType[] arrayRefVar = new dataType[arraySize]; //例如 int[] a = new int[1];

在創建一個數組的時候,所有的元素都會初始化為0.boolean數組的元素會初始化為false,對象數組的元素會變為null,表示數組還沒有存放任何對象

數組一但創建就無法更改長度,只能更改元素的值.要在運訓中擴展數組大小用到後面學習的array list數組列表.


數組的初始化

方式一(靜態初始化)

java提供了創建數組並同時賦予初始值的簡化形式. 由程序員顯式指定每個數組元素的初始值,有系統決定數組的長度;

例如

int[] ar;

a = new int[]{2,3,4};

可以簡化為

int[] a = {2,3,4};

註意以空格隔開最後一位沒有逗號,使用這種方式不需要關鍵字new

String stringArray[] = {"h", "j", "b"};

方式二 (動態初始化)

初始化時由程序員指定數組的長度,由系統初始化每個數組元素的默認值。

float[] floatArray= new float[3];

floatArray[0] = 1.0f;

floatArray[1] = 132.63f;

floatArray[2] = 100F;

靜態可以用循環來給數組賦值

int[] a=new int[10];

forint i = 1; i < 100; i++){

a[i]=i;

}

初始化和動態初始化開始都指定了數組大小,java也在棧空間分配了相應的大小,只是靜態初始化開始就指定了值,而動態初始是在後面指定數組的值,剛開始數組的值都是默認值

註意:不要在進行數組初始化時,既指定數組的長度,也為每個數組元素分配初始值。

初始化匿名數組

new int[]{2,3,4};


數組的操作

數組元素的應用

可以使用數組名[下標]來使用下標元素

arrayName[index];// a=a[1];

數組的遍歷;

int[] a = { 1, 2, 3 };

for (int i = 0; i < 3; i++) {

System.out.println(a[i]);

}

數組可以用數組名.length來獲取數組的長度,因此可以這遍歷

int[] a = { 1, 2, 3 };

for (int i = 0; i < i.length; i++) {

System.out.println(a[i]);

}

java有一種功能很強的循環結構,用來處理數組中的每個元素,不必為制定下標分心

增強for循環也叫for each循環遍歷

int[] a = {1,2,3};

for(int i:a){

System.out.println(i);

}

語法為:

for( arrayType varName: arrayName ){

// Some Code

}


arrayType 為數組類型(也是數組元素的類型);varName 是用來保存當前元素的變量,每次循環它的值都會改變;arrayName 為數組名稱。

每循環一次,就會獲取數組中下一個元素的值,保存到 varName 變量,直到數組結束。即,第一次循環 varName 的值為第0個元素,第二次循環為第1個元素......例如:

數組拷貝

java中允許把一個數組變量拷貝給另一個數組變量,這時候兩個變量引用同一個數組.這個時候兩個變量指向同一個數組.

例如

int[] s = new int[6];

int[] x = s;

x[5] = 12;

這個時候也s[5]也是12

技術分享圖片

拷貝一個數組變量

如果希望把一個數組的所有值拷貝到一個新的數組中區,(以int[] 為例子)

可以使用Arrays類的copyTo方法:

int[] copyx = Arrays.copyOf(x,copyx.length)

第二個參數是新數組的長度,這個方法常用來增加數組的長度

int[] src = {1,3,5,7,9,11,13,15,17};

int[] dest = {2,4,6,8,10,12,14,16,18,20};

//copyOf(是復制src數組從0開始的兩個元素到新的數組對象)

int[] copyof=Arrays.copyOf(src, 2);

//[1,3]

System.arraycopy的用法:

System.arraycopy(x,下標,copyx,下標2,下標3)

第一個小標表示從原數組那個下標開始,第三個表示從目標數組的那個下標開始,到下標3

int[] x= {1,3,5,7,9,11,13,15,17};

int[] s = {2,4,6,8,10,12,14,16,18,20};

//從x中的第一個元素起復制三個元素,即1,3,5復蓋到s第2個元素開始的三個元素

System.arraycopy(x, 0,s, 1, 3);

結果

//[2, 1, 3, 5, 10, 12, 14, 16, 18, 20]

Arrays.copyOfRange的用法

int[] copyx = Arrays.copyOfRange(x,下標1,下標2);

參數表示從下標一到下標2的距離;

int[] src = {1,3,5,7,9,11,13,15,17};

int[] dest = {2,4,6,8,10,12,14,16,18,20};

//copyRange(從src數組中從0開始的第二個元素到第五個元素復制到新數組,含頭不含尾)

int[] copyofRange=Arrays.copyOfRange(src, 2,6);

//[5, 7, 9, 11]

如果數組是數值型那麽多余的元素會被賦值為0;如果前面的數組元素是bollean類型,會被賦值為false,相反,如果長度小於原數組長度則會這拷貝前面的元素.


Arrays類的使用

java.util.Arrays類能方便地操作數組,它提供的所有方法都是靜態的。具有以下功能:

給數組賦值:通過fill方法。

對數組排序:通過sort方法,按升序。

比較數組:通過equals方法比較數組中元素值是否相等。

查找數組元素:通過binarySearch方法能對排序好的數組進行二分查找法操作。

import java.util.Arrays;

public class TestArrays {

public static void output(int[] array) {

if (array != null) {

for (int i = 0; i < array.length; i++) {

System.out.print(array[i] + " ");

}

}

System.out.println();

}

public static void main(String[] args) {

int[] array = new int[5];

// 填充數組

Arrays.fill(array, 5);

System.out.println("填充數組:Arrays.fill(array, 5):");

TestArrays.output(array);

// 將數組的第2和第3個元素賦值為8

Arrays.fill(array, 2, 4, 8);

System.out.println("將數組的第2和第3個元素賦值為8:Arrays.fill(array, 2, 4, 8):");

TestArrays.output(array);

int[] array1 = { 7, 8, 3, 2, 12, 6, 3, 5, 4 };

// 對數組的第2個到第6個進行排序進行排序

Arrays.sort(array1, 2, 7);

System.out.println("對數組的第2個到第6個元素進行排序進行排序:Arrays.sort(array,2,7):");

TestArrays.output(array1);

// 對整個數組進行排序

Arrays.sort(array1);

System.out.println("對整個數組進行排序:Arrays.sort(array1):");

TestArrays.output(array1);

// 比較數組元素是否相等

System.out.println("比較數組元素是否相等:Arrays.equals(array, array1):" + "\n" + Arrays.equals(array, array1));

int[] array2 = array1.clone();

System.out.println("克隆後數組元素是否相等:Arrays.equals(array1, array2):" + "\n" + Arrays.equals(array1, array2));

// 使用二分搜索算法查找指定元素所在的下標(必須是排序好的,否則結果不正確)

Arrays.sort(array1);

System.out.println("元素3在array1中的位置:Arrays.binarySearch(array1, 3):" + "\n" + Arrays.binarySearch(array1, 3));

// 如果不存在就返回負數

System.out.println("元素9在array1中的位置:Arrays.binarySearch(array1, 9):" + "\n" + Arrays.binarySearch(array1, 9));

}}


數組的常見異常

1數組越界異常 ArrayIndexOutOfBoundsException

訪問了不存在的下標值,下標從0開始

public static void main(String[] args) {

int[] x = { 1, 2, 3 };

System.out.println(x[3]);

//java.lang.ArrayIndexOutOfBoundsException

}

2 NullPointerException 空指針異常

引用類型變量沒有指向任何對象,而訪問了對象的屬性或者是調用了對象的方法。

public static void main(String[] args) {

int[] x = { 1, 2, 3 };

x = null;

System.out.println(x[1]);

// java.lang.NullPointerException

}

技術分享圖片



第四天 一維數組初步學習