第四天 一維數組初步學習
數組是一種數據結構,用來存儲同一類型值的集合.
具體的來說,將有限個類型相同的變量的集合命名,這個名稱就是數組.組成數組的各個變量稱為數組的分量,也叫數組的元素.用於區分數組的各個元素的元素的數字編號稱為下表.
數組的特點:
數組是相同數據類型的元素集合.
數組中的個元素的存儲是有先後順序的,他們在內存中按先後順序連續存放在一起.
好處:
可能會看到這樣的數組:
比如說一個 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
}
第四天 一維數組初步學習