本篇文章給大家帶來了關于java的相關知識,其中主要介紹了關于數組的相關問題,包括了數組的定義、數組的屬性以及內存圖還有常見的一些問題,下面一起來看一下,希望對大家有幫助。

推薦學習:《java視頻教程》
數組的定義
1.概述
- 假如有一個班同學的成績需要存儲,該使用什么方法呢?
- 像我們之前學習的,可以定義多個變量存儲不同的成績。但是要有1000多個學生,那么到定義1000多個變量嗎?當然不行,這就需要用到我們的數組了。
2.靜態初始化數組
特點:定義數組的時候直接給數組賦值,由系統決定數組長度
通用格式:
數據類型[] 數組名 = { 元素1,元素2 ,元素3,… }; 例如: int [] array= {1,2,3,4,5}; double[] scores = {88.5, 99.5, 59.5};
3.動態初始化數組
特點:定義數組時確了定元素的類型和數組的長度,之后存入數據
通用格式:
數據類型[] 數組名 = new 數據類型[長度]; 例如: int [] array= new int[5]; double[] scores = new double[3];
默認值:
| 數據類型 | 具體定義類型 | 默認值 |
| 基本類型 |
byte、short、char、int、long |
0 |
|
float、double |
0.0 | |
|
boolean |
false | |
| 引用類型 |
類、接口、數組、String |
null |
4.總結
- 數組適合同種類型的大量數據
- 靜態初始化適合知道了元素值
- 動態初始化適合不清楚存入哪些數據
數組的屬性
1.訪問
- 一般訪問數組的方式為:
數組名稱[索引]
例題:
//靜態初始化數組 int [] array= {1,2,3,4,5}; System.out.println(array[0]);//輸出 1 System.out.println(array[1]);//輸出 2 System.out.println(array[3]);//輸出 4
2.長度
- 長度可以直接調用length得到數組的長度。
例題:
//靜態初始化數組 int [] array= {1,2,3,4,5}; System.out.println(array.length);//調用方法,輸出長度 5 //最大索引array.length-1
3.遍歷
- 遍歷就是一個一個數組元素的訪問,主要應用在搜索、數據統計……
- 我們之前學了第7天:循環結構、第6天:分支結構,下面通過for循環遍歷一個數組
例題:
- 給定元素 {10,8,9,4,5,6,8,71,2,3,9,99},用靜態數組存儲并輸出數組中大于5的元素?
編碼實現:
//靜態初始化數組 int [] array= {10,8,9,4,5,6,8,71,2,3,9,99}; for(int i=0;i<array.length;i++) { if(array[i]>5) System.out.println(array[i]); }
輸出結果:
10 8 9 6 8 71 9 99
內存圖

- Java在程序運行時,需要在內存中分配空間,對空間進行了不同區域的劃分。
- 棧內存:存儲局部變量,使用完畢立即消失
- 堆內存:存儲new 出來的內容(對象、實體),地址使用完畢在垃圾回收器空閑時回收
1.單數組內存圖
- 下面的創建數組代碼,實現它的內存關系圖
編碼實現:
//動態初始化數組 int [] arr=new int[3]; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //修改值 arr[0]=100; arr[2]=200; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]);
輸出結果:
[I@15db9742 0 0 0 [I@15db9742 100 0 200
原理講解:

- 動態初始化先在堆內存生成一個new 一個arr 地址值,具體看編譯器的結果,這里假設001。由于動態初始化,所以每個元素都有一個初始值,具體可以看上面的表。我們輸出元素,先訪問數組名地址,到堆內存下標,再輸出元素值。
- 修改數組值,歷程和查看相同,只不過多了一步修改的過程,如下圖:

2.多數組內存圖

- 多個數組和單數組內存使用原理相同,這里我就不過多講述了。
3.數組指向相同內存
- 假如我們把兩個數組的地址值改為相同,修改后的結果該是如何,如下面的代碼。
編碼實現:
//動態初始化數組 int [] arr=new int[3]; arr[0]=100; arr[1]=200; arr[2]=300; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int [] arr2=arr; arr2[0]=111; arr2[1]=222; arr2[2]=333; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr2); System.out.println(arr2[0]);
輸出結果:
[I@15db9742 100 200 300 [I@15db9742 111 [I@15db9742 111
原理講解:

- 第一個數組在堆內存的地址為001,第二個數組也為001,所以修改第二個數組的值,其實都是同一個數組內存。第一個數組的值也會隨著改變,結果如下:

常見問題
1.索引越界
//靜態初始化數組 int [] array= {1,2,3}; System.out.println(array[3]);
- 上面的代碼運行之后,會出現下面的報錯異常:
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
- 解釋:我們靜態化初始數組給了3個數字,最大索引為2,當我們訪問3時,就會報錯
2.空指針異常
//動態初始化數組 int [] array= new int[3]; array=null; System.out.println(array[0]);
- 上面的代碼運行之后,會出現下面的報錯異常:
- Exception in thread "main" java.lang.NullPointerException
- 解釋:我們將數組置為null,導致訪問的數組不指向堆內存的數據
推薦學習:《java視頻教程》
站長資訊網