Java學習之數組
一、什麽是數組?
1. 數組是一個存儲多個相同類型的數據的容器,實現對這些數據的統一管理
2. 數組中的元素可以是任何數據類型,包括基本數據類型和引用數據類型
3. 數組屬於引用類型,數組型數據是對象,數組中的每個元素相當於該對象的成員變量
二、一維數組
1. 什麽是初始化?
所謂的初始化就是為數組分配內存空間,並且為每個數組元素賦值
Java中的數組必須先初始化,然後才能使用
2. 初始化有幾種方式?
1)動態初始化
指的是初始化時只指定數組長度,由虛擬機為數組分配初始值
格式:
數據類型[] 數組名 = new 數據類型[數組長度];
例如:
int[] arr = new int[3];
2)靜態初始化
指的是初始化時就為數組分配空間並依次對數組元素賦值
格式:
數據類型[] 數組名 = new 數據類型[]{元素1,元素2...};//(靜態初始化標準格式)
數據類型[] 數組名 = {元素1, 元素2...};//(靜態初始化簡化格式)
例如:
int[] arr1 = new int[]{1, 2, 3, 4, 5};
或者
int[] arr2 = {1, 2, 3, 4, 5};
3. 註意:數組是引用類型,它的元素相當於類的成員變量,因此數組已經分配空間,其中的每個元素也被按照成員變量同樣的方法被隱式初始化,一旦初始化,其長度是不可變的
4. 初始化默認值問題?
整型數組 byte / short / int / long 默認值為0
浮點型數組 float/ double 默認值為0.0
字符型數組 char 默認值為\u0000
布爾型數組 boolean 默認值為false
5. 存放數組元素值
格式:
數組名[索引] = 數值
例如:
//創建一個數組
int[] arr = new int[3];
//依次為數組元素賦值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
6. 取出數組元素
格式:
數組名[索引];
例如:
//創建一個數組
int[] arr = {1, 2, 3, 4, 5};
//我要取出第三個元素(值為3),由於數組的索引是從0開始的,所以第三個元素的索引值為(數組長度-1),即為2
//將取出的數組元素放到一個變量裏存儲,以便後續對該結果變量進行相關處理
int num = arr[2];
//打印這個值
System.out.println(num);
7. 一維數組在內存中的分配
1 package com.cnblogs; 2 3 import java.util.Arrays; 4 5 public class ArrayDemo1 { 6 public static void main(String[] args) { 7 /** 8 * 動態初始化數組,並依次打印賦值前後的數組 9 */ 10 //動態初始化數組,並為數組分配空間 11 int[] arr1 = new int[3]; 12 //打印數組 13 System.out.println(Arrays.toString(arr1));//[0, 0, 0] 14 //分割線 15 System.out.println("----------"); 16 //為數組元素賦值 17 arr1[0] = 1; 18 arr1[1] = 2; 19 arr1[2] = 3; 20 //打印數組 21 System.out.println(Arrays.toString(arr1));//[1, 2, 3] 22 //分割線 23 System.out.println("----------"); 24 25 /** 26 * 靜態初始化數組,並打印數組 27 */ 28 //靜態初始化數組,在定義的同時就為數組元素分配空間並賦值 29 //靜態初始化精簡版 30 int[] arr2 = {4, 5, 6}; 31 //靜態初始化標準版 32 //int[] arr2 = new int[]{4, 5, 6}; 33 //打印數組 34 System.out.println(Arrays.toString(arr2));//[4, 5, 6] 35 } 36 }
結果為:
分析:
1. 第11行代碼 int[] arr1 創建一個int類型的數組,引用變量(數組名)為arr1,此時在棧區中開辟內存空間。
2. 第11行代碼 new int[3] 在堆內存中開辟空間,由於是int類型的數組,所以虛擬機會為每個數組元素賦上默認值0,
3. 第11行代碼 int[] arr1 = new int[3] 將new出來的數組的內存地址值復制給arr1引用變量(數組名),arr1指向堆內存中的new出來的數組。此時,完成了數組的創建以及初始化這一整個流程
4. 第13行 打印數組(由於沒有手動給該數組賦值,所以打印出來的數組元素值都為虛擬機默認給該數組初始化的值0)
5. 第17-19行 通過引用變量指向該數組,根據索引來為數組元素賦值
6. 第21行 由於我們通過索引給數組元素賦值了,所以打印出來的結果和第13行打印出來的結果不一樣
7. 後面的同理...
三、二維數組
1. 什麽是二維數組?
Java實際上沒有多維數組,只有一維數組。多維數組可以理解為"數組中的數組"。二維數組本質上是一個一維數組,只是該數組的每個數組元素都是一個一維數組
註意:其實一維數組和多維數組和二維數組並沒有多少區別,沒必要把多維數組想的太復雜了
2. 格式?
數據類型[][] 數組名 = new 數據類型[二維數組的長度 / 包含的一維數組的個數][每個一維數組的長度];
例如:
int[][] arr = new int[3][5];//定義了一個整型的二維數組,其中包含3個一維數組,每個一維數組可以存儲5個整數
3. 獲取多維數組的元素
arr[0];//索引為0的位置上的一維數組
arr[1][3];//如果要獲取具體的元素需要兩個下標
4. 二維數組在內存中的分配
1 package com.cnblogs; 2 3 import java.util.Arrays; 4 5 public class ArrayDemo2 { 6 public static void main(String[] args) { 7 /** 8 * 二維數組動態初始化 9 */ 10 //二維數組初始化 11 String[][] str1 = new String[2][2]; 12 13 str1[0][0] = "鳴人"; 14 str1[0][1] = "路飛"; 15 str1[1][0] = "一護"; 16 str1[1][1] = "柯南"; 17 18 //打印數組 19 System.out.println(Arrays.toString(str1));//[[Ljava.lang.String;@f6b7e0e, [Ljava.lang.String;@5a20d10a] 20 21 //打印數組 22 for(int i = 0; i < str1.length; i++) { 23 for(int j = 0; j < str1.length; j++) { 24 System.out.print(str1[i][j] + " "); 25 } 26 System.out.println(); 27 } 28 29 int[][] arr1 = new int[3][]; 30 arr1[0] = new int[3]; 31 arr1[1] = new int[2]; 32 arr1[2] = new int[1]; 33 arr1[1][1] = 90; 34 arr1[2][0] = 100; 35 36 //打印二維數組 37 System.out.println(Arrays.deepToString(arr1)); 38 } 39 }
結果為:
四、數組常見異常
1. 數組索引越界異常(ArrayIndexOutOfBoundsException)
當引用變量訪問了數組不存在的索引時,就會引發該異常
2. 空指針異常(NullPointerException)
1)如果數組名沒有指向任何數組對象,即數組的值為null,但依舊使用該數組名訪問數組的索引,就會引發該異常
2)如果一個引用類型的變量沒有被賦值,但還是調用了它相關的方法,也會引發該異常
1 package com.cnblogs; 2 3 import java.util.Random; 4 5 public class ArrayExceptionDemo { 6 public static void main(String[] args) { 7 /** 8 * 空指針異常,數組名沒有指向數組對象,所以無法根據索引訪問該數組 9 */ 10 int[] arr1 = {1, 2, 3, 4, 5}; 11 arr1 = null; 12 System.out.println(arr1[2]); 13 14 /** 15 * 空指針異常,r沒有指向Random對象,所以無法訪問Random對象中的nextInt()方法 16 */ 17 Random r = new Random(); 18 r = null; 19 System.out.println(r.nextInt(10)); 20 21 /** 22 * 數組索引越界異常,arr2數組索引最大為3,沒有4索引 23 */ 24 int[] arr2 = {1, 2, 3}; 25 System.out.println(arr2[4]); 26 } 27 }
五、學習中的感想
1. 數組的索引是從0開始的
2. 無論是遍歷數組,還是通過for循環創建數組,以及給數組賦值等,一定時刻要註意索引值,不能數組索引越界,也不能少計算錯一個索引
3. 熟悉數組在內存中的分配情況
4. 熟悉Arrays工具類中的方法,sort(),toString()等常用方法
Java學習之數組