1. 程式人生 > 實用技巧 >學渣學習java第四天

學渣學習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 動態初始化格式

資料型別[] 陣列名 = new 資料型別[陣列長度];
int[] arr = new int[3];

1.3.3 動態初始化格式詳解

  • 等號左邊:

    • int:陣列的資料型別

    • []:代表這是一個數組

    • arr:代表陣列的名稱

  • 等號右邊:

    • new:為陣列開闢記憶體空間

    • int:陣列的資料型別

    • []:代表這是一個數組

    • 5:代表陣列的長度

程式碼 :

package com.itheima.array;

public class Demo2Array {
/*
陣列的動態初始化:
在初始化的時候, 需要手動指定陣列的長度, 系統會為陣列容器分配初始值.

動態初始化格式:
資料型別[] 陣列名 = new 資料型別[陣列的長度];

注意:
列印陣列變數的時候, 會打印出陣列的記憶體地址

[I@10f87f48 :

@ : 分隔符
[ : 當前的空間是一個數組型別
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];
// [I@10f87f48
System.out.println(arr);

byte[] bArr = new byte[3];
// [B@b4c966a
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); // 陣列的記憶體地址 [I@10f87f48

// 陣列名[索引] 訪問陣列容器中的空間位置
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記憶體分配-一個數組記憶體圖

1.7 兩個陣列記憶體圖

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

1.9 陣列的靜態初始化

1.9.1 什麼是靜態初始化

在建立陣列時,直接將元素確定

1.9.2 靜態初始化格式

  • 完整版格式

    資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,...};
  • 簡化版格式

    資料型別[] 陣列名 = {元素1,元素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);
    }
    }