1. 程式人生 > >Java學習之數組

Java學習之數組

存在 img 對數 內存 二維數組 方法 ack tro ima

一、什麽是數組?

  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學習之數組