天天看點

JAVA數組 詳解及應用

1.數組

1.1 數組介紹

​ 數組就是存儲資料長度固定的容器,存儲多個資料的資料類型要一緻。

1.2 數組的定義格式

1.2.1 第一種格式

​ 資料類型[] 數組名

​ 示例:

int[] arr;        
double[] arr;      
char[] arr;
           

1.2.2 第二種格式

​ 資料類型 數組名[]

​ 示例:

int arr[];
double arr[];
char arr[];
           

1.3 數組的動态初始化

1.3.1 什麼是動态初始化

​ 數組動态初始化就是隻給定數組的長度,由系統給出預設初始化值

1.3.2 動态初始化格式

1.3.3 動态初始化格式詳解

  • 等号左邊:
    • int:數組的資料類型
    • []:代表這是一個數組
    • arr:代表數組的名稱
  • 等号右邊:
    • new:為數組開辟記憶體空間
    • int:數組的資料類型
    • []:代表這是一個數組
    • 5:代表數組的長度

代碼 :

package com.itheima.array;

public class Demo2Array {
    /*
        數組的動态初始化:
                        在初始化的時候, 需要手動指定數組的長度, 系統會為數組容器配置設定初始值.

        動态初始化格式:
                        資料類型[] 數組名 = new 資料類型[數組的長度];

        注意:
                        列印數組變量的時候, 會列印出數組的記憶體位址

        [[email protected] :

                        @ : 分隔符
                        [ : 目前的空間是一個數組類型
                        I : 目前數組容器中所存儲的資料類型
                        10f87f48 : 十六進制記憶體位址

                                0 1 2 3 4 5 6 7 8 9 a b c d e f
     */
    public static void main(String[] args) {
        // 資料類型[] 數組名 = new 資料類型[數組的長度];
        // 通過new關鍵字建立了一個int類型的數組容器, 該容器可以存儲5個int類型的整數, 該容器被arr數組變量所記錄
        int[] arr = new int[5];
        // [[email protected]
        System.out.println(arr);

        byte[] bArr = new byte[3];
        // [[email protected]
        System.out.println(bArr);

    }
}

           

1.4 數組元素通路

1.4.1 什麼是索引

​ 每一個存儲到數組的元素,都會自動的擁有一個編号,從0開始。

​ 這個自動編号稱為數組索引(index),可以通過數組的索引通路到數組中的元素。

1.4.2通路數組元素格式

1.4.3示例代碼

package com.itheima.array;

public class Demo3ArrayIndex {
    /*
        數組動态初始化:
                初始化的時候, 手動指定數組長度, 系統會為數組容器配置設定初始值.

        數組的元素通路格式:
                數組名[索引]

                索引: 數組中資料的編号方式, 編号從0開始
                作用: 通路數組容器中的空間位置

        注意:
                數組在建立完畢後, 即使沒有指派, 也可以取出, 但取出的元素都是預設初始化值.

     */
    public static void main(String[] args) {
        int[] arr = new int[3];         // 0 1 2
        System.out.println(arr);        // 數組的記憶體位址  [[email protected]

        // 數組名[索引]  通路數組容器中的空間位置
        System.out.println(arr[0]);     // 0  系統自動配置設定的預設初始化值
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println("--------------");

        // 數組名[索引]
        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}
           

1.5 記憶體配置設定

1.5.1 記憶體概述

​ 記憶體是計算機中的重要原件,臨時存儲區域,作用是運作程式。

​ 我們編寫的程式是存放在硬碟中的,在硬碟中的程式是不會運作的。

​ 必須放進記憶體中才能運作,運作完畢後會清空記憶體。

​ Java虛拟機要運作程式,必須要對記憶體進行空間的配置設定和管理。

1.5.2 java中的記憶體配置設定

  • 目前我們隻需要記住兩個記憶體,分别是:棧記憶體和堆記憶體
區域名稱 作用
寄存器 給CPU使用,和我們開發無關。
本地方法棧 JVM在使用作業系統功能的時候使用,和我們開發無關。
方法區 存儲可以運作的class檔案。
堆記憶體 存儲對象或者數組,new來建立的,都存儲在堆記憶體。
方法棧 方法運作時使用的記憶體,比如main方法運作,進入方法棧中執行。

1.6 Java記憶體配置設定-一個數組記憶體圖

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-qwLujQh3-1613126316874)(.\img\1591007817165.png)]

1.7 兩個數組記憶體圖

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-K8L5lZnH-1613126316880)(.\img\1591007925899.png)]

1.8 多個數組指向相同記憶體圖

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-SM2lDGci-1613126316882)(.\img\1591007957052.png)]

1.9 數組的靜态初始化

1.9.1 什麼是靜态初始化

​ 在建立數組時,直接将元素确定

1.9.2 靜态初始化格式

  • 完整版格式
  • 簡化版格式

1.9.3示例代碼

package com.itheima.array2;

public class Demo1Array {
    /*
        數組靜态初始化 : 初始化時指定每個數組元素的初始值,由系統決定數組長度

        完整格式:
                    資料類型[] 數組名 = new 資料類型[]{資料1,資料2,資料3...};
        簡化格式:
                    資料類型[] 數組名 = {資料1,資料2,資料3...};
     */
    public static void main(String[] args) {
        // 資料類型[] 數組名 = new 資料類型[]{資料1,資料2,資料3...};
        int[] arr = new int[]{11,22,33};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        // 資料類型[] 數組名 = {資料1,資料2,資料3...};
        int[] arr2 = {44,55,66};
        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);

    }
}
           

1.10 數組操作的兩個常見問題

1.10.1 索引越界異常

  • 出現原因
    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
            System.out.println(arr[3]);
        }
    }
               

    數組長度為3,索引範圍是0~2,但是我們卻通路了一個3的索引。

    程式運作後,将會抛出ArrayIndexOutOfBoundsException 數組越界異常。在開發中,數組的越界異常是不能出現的,一旦出現了,就必須要修改我們編寫的代碼。

  • 解決方案

    将錯誤的索引修改為正确的索引範圍即可!

1.10.2 空指針異常

  • 出現原因
    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
    
            //把null指派給數組
            arr = null;
            System.out.println(arr[0]);
        }
    }
               
    arr = null 這行代碼,意味着變量arr将不會在儲存數組的記憶體位址,也就不允許再操作數組了,是以運作的時候會抛出 NullPointerException 空指針異常。在開發中,數組的越界異常是不能出現的,一旦出現了,就必須要修改我們編寫的代碼。
  • 解決方案

    給數組一個真正的堆記憶體空間引用即可!

1.11 數組周遊

  • 數組周遊:就是将數組中的每個元素分别擷取出來,就是周遊。周遊也是數組操作中的基石。
    public class ArrayTest01 {
    	public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5 };
    		System.out.println(arr[0]);
    		System.out.println(arr[1]);
    		System.out.println(arr[2]);
    		System.out.println(arr[3]);
    		System.out.println(arr[4]);
    	}
    }
               
    以上代碼是可以将數組中每個元素全部周遊出來,但是如果數組元素非常多,這種寫法肯定不行,是以我們需要改造成循環的寫法。數組的索引是 0 到 lenght-1 ,可以作為循環的條件出現。
    public class ArrayTest01 {
        public static void main(String[] args) {
            //定義數組
            int[] arr = {11, 22, 33, 44, 55};
    
            //使用通用的周遊格式
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
        }
    }
               

1.12 數組擷取最大值

  • 最大值擷取:從數組的所有元素中找出最大值。
  • 實作思路:
    • 定義變量,儲存數組0索引上的元素
    • 周遊數組,擷取出數組中的每個元素
    • 将周遊到的元素和儲存數組0索引上值的變量進行比較
    • 如果數組元素的值大于了變量的值,變量記錄住新的值
    • 數組循環周遊結束,變量儲存的就是數組中的最大值
  • 代碼實作:
    package com.itheima.test;
    
    import java.util.Scanner;
    
    public class Test2Array {
        /*
            需求: 從數組中查找最大值
    
                    int[] arr = {12,45,98,73,60};
    
            實作步驟:
                    1. 假設數組中的第一個元素為最大值
                    2. 周遊數組, 擷取每一個元素, 準備進行比較
                    3. 如果比較的過程中, 出現了比max更大的, 讓max記錄更大的值
                    4. 循環結束後, 列印最大值.
         */
        public static void main(String[] args) {
            int[] arr = {12,45,98,73,60};
            // 1. 假設數組中的第一個元素為最大值
            int max = arr[0];
            // 2. 周遊數組, 擷取每一個元素, 準備進行比較
            for(int i = 1; i < arr.length; i++){
                // 3. 如果比較的過程中, 出現了比max更大的, 讓max記錄更大的值
                if(arr[i] > max){
                    max = arr[i];
                }
            }
            //  4. 循環結束後, 列印最大值.
            System.out.println("max:" + max);
        }
    }
    
               

1.13 數組元素求和

  • 需求:鍵盤錄入5個整數,存儲到數組中,并對數組求和
  • 思路:

    ​ 1.建立鍵盤錄入對象,準備鍵盤錄入

    ​ 2.定義一個求和變量,準備記錄累加後的結果

    ​ 3.動态初始化一個長度為5的int數組,準備存儲鍵盤錄入的數值

    ​ 4.将鍵盤錄入的數值存儲到數組中

    ​ 5.周遊數組,取出每一個元素,并求和

    ​ 6.輸出總和

  • 代碼實作:
    package com.itheima.test;
    
    import java.util.Scanner;
    
    public class Test3Array {
        /*
            需求:鍵盤錄入5個整數,存儲到數組中,并對數組求和
    
            思路:
                1.建立鍵盤錄入對象,準備鍵盤錄入
                2.定義一個求和變量,準備記錄累加後的結果
                3.動态初始化一個長度為5的int數組,準備存儲鍵盤錄入的數值
                4.将鍵盤錄入的數值存儲到數組中
                5.周遊數組,取出每一個元素,并求和
                6.輸出總和
         */
        public static void main(String[] args) {
            // 1.建立鍵盤錄入對象,準備鍵盤錄入
            Scanner sc = new Scanner(System.in);
            // 2.定義一個求和變量,準備記錄累加後的結果
            int sum = 0;
            // 3.動态初始化一個長度為5的int數組,準備存儲鍵盤錄入的數值
            int[] arr = new int[5];
            // 4.将鍵盤錄入的數值存儲到數組中
            for(int i = 0; i < arr.length; i++){
                System.out.println("請輸入第" + (i+1) + "個整數:");
                //arr[i] = 10;
                arr[i] = sc.nextInt();
            }
    
            // 5.周遊數組,取出每一個元素,并求和
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
    
            // 6.輸出總和
            System.out.println("sum:" + sum);
    
        }
    }
    
               

1.14 數組基本查找【應用】

  • 需求:

    ​ 已知一個數組 arr = {19, 28, 37, 46, 50}; 鍵盤錄入一個資料,查找該資料在數組中的索引,并在控

    ​ 制台輸出找到的索引值。

  • 思路:

    ​ 1.定義一個數組,用靜态初始化完成數組元素的初始化

    ​ 2.鍵盤錄入要查找的資料,用一個變量接收

    ​ 3.定義一個索引變量,初始值為-1

    ​ 4.周遊數組,擷取到數組中的每一個元素

    ​ 5.拿鍵盤錄入的資料和數組中的每一個元素進行比較,如果值相同,就把該值對應的索引指派給索引變量,并結束循環

    ​ 6.輸出索引變量

  • 代碼實作:
    public static void main(String[] args) {
            // 1.定義一個數組,用靜态初始化完成數組元素的初始化
            int[] arr = {19, 28, 37, 46, 50};
            // 2.鍵盤錄入要查找的資料,用一個變量接收
            Scanner sc = new Scanner(System.in);
            System.out.println("請輸入您要查找的元素:");
            int num = sc.nextInt();
            // 3.定義一個索引變量,初始值為-1
            // 假設要查找的資料, 在數組中就是不存在的
            int index = -1;
            // 4.周遊數組,擷取到數組中的每一個元素
            for (int i = 0; i < arr.length; i++) {
                // 5.拿鍵盤錄入的資料和數組中的每一個元素進行比較,如果值相同,就把該值對應的索引指派給索引變量,并結束循環
                if(num == arr[i]){
                    // 如果值相同,就把該值對應的索引指派給索引變量,并結束循環
                    index = i;
                    break;
                }
            }
            //  6.輸出索引變量
            System.out.println(index);
        }
    }
    
               

1.15 評委打分【應用】

  • 需求:在程式設計競賽中,有6個評委為參賽的選手打分,分數為0-100的整數分。

    ​ 選手的最後得分為:去掉一個最高分和一個最低分後 的4個評委平均值 (不考慮小數部分)。

  • 思路:

    ​ 1.定義一個數組,用動态初始化完成數組元素的初始化,長度為6

    ​ 2.鍵盤錄入評委分數

    ​ 3.由于是6個評委打分,是以,接收評委分數的操作,用循環

    ​ 4.求出數組最大值

    ​ 5.求出數組最小值

    ​ 6.求出數組總和

    ​ 7.按照計算規則進行計算得到平均分

    ​ 8.輸出平均分

  • 代碼實作:
    public static void main(String[] args) {
            // 1.定義一個數組,用動态初始化完成數組元素的初始化,長度為6
            int[] arr = new int[6];
            // 2.鍵盤錄入評委分數
            Scanner sc = new Scanner(System.in);
            //  3.由于是6個評委打分,是以,接收評委分數的操作,用循環
            for (int i = 0; i < arr.length; i++) {
                System.out.println("請輸入第" + (i+1) + "個評委的打分:");
                int score = sc.nextInt();
                if(score >= 0 && score <= 100){
                    // 合法的分值
                    arr[i] = score;
                }else{
                    // 非法的分值
                    System.out.println("您的打分輸入有誤, 請檢查是否是0-100之間的");
                    i--;
                }
            }
    
            // 4.求出數組最大值
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(max < arr[i]){
                    max = arr[i];
                }
            }
    
            // 5.求出數組最小值
            int min = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(min > arr[i]){
                    min = arr[i];
                }
            }
    
            // 6.求出數組總和
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
    
            // 7.按照計算規則進行計算得到平均分
            int avg = (sum - max - min ) / 4;
    
            // 8.輸出平均分
            System.out.println(avg);
        }
    }