java陣列

瑪拉_以琳發表於2020-12-19

1.陣列

概念:

​ 指的是一種容器,可以同來儲存同種資料型別的多個值。

​ 但是陣列容器在儲存資料的時候,需要結合隱式轉換考慮。

比如:

​ 定義了一個int型別的陣列。那麼boolean。double型別的資料是不能存到這個陣列中的,

​ 但是byte型別,short型別,int型別的資料是可以存到這個陣列裡面的。

建議:

​ 容器的類,和儲存的資料型別保持一致。

舉例:

​ 整數1 2 3 4 56 就可以使用int型別的陣列來儲存。

​ 小數1.1 1.2 1.3 1.4 就可以使用double型別的陣列來儲存。

​ 字串"aaa" "bbb" "ccc" 就可以使用String型別的陣列來儲存。

2.陣列的定義

格式一:

​ 資料型別 [] 陣列名

比如:int [] array

格式二:

​ 資料型別 陣列名 []

比如: int array []

詳解:

資料型別:限定了陣列以後能存什麼型別的資料。

方括號:表示現在定義的是一個陣列。

陣列名:就是一個名字而已,方便以後使用。

注意點:

​ 方法括號跟陣列名,誰寫在前面,誰寫在後面都是一樣的。

​ 平時習慣性使用第一種方式。

3.陣列的靜態初始化

完整格式:

​ 資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,元素3,元素4...};

比如:

​ int[] arr = new int[]{11,22,33};

​ double[] arr = new double[]{1.1,1.2,1.3};

格式詳解:

​ 資料型別:限定了陣列以後能存什麼型別的資料。

​ 方括號:表示現在定義的是一個陣列。

​ 陣列名:其實就是名字而已,方便以後使用,在起名字的時候遵循小駝峰命名法。

​ arr namesArr

​ new:就是給陣列在記憶體中開闢了一個空間。

​ 資料型別:限定了陣列以後能存什麼型別的資料。

​ 前面和後面的資料型別一定要保持一致。

​ int[] arr = new double[]{11,22,33};//錯誤寫法

​ 方括號:表示現在定義的是一個陣列。

​ 大括號:表示陣列裡面的元素。元素也就是存入到陣列中的資料。

​ 多個元素之間,一定要用逗號隔開。

注意點:

  • 等號前後的資料型別必須保持一致。
  • 陣列一旦建立之後,長度不能發生變化。

簡化格式:

​ 資料型別[] 陣列名 = {元素1,元素2,元素3,元素4...};

比如:

​ int[] array = {1,2,3,4,5};

​ double[] array = {1.1,1.2,1.3};

練習1:

定義陣列儲存5個學生的年齡。

1.給陣列限定什麼型別? int
2.利用靜態初始化完成建立並新增元素
int[] agesArr = new int[]{18,19,20,21,22};
int[] agesArr = {18,19,20,21,22};

練習2:

定義陣列儲存3個學生的姓名。

1.給陣列限定什麼型別? String
2.利用靜態初始化完成建立並新增元素
String[] namesArr = new String[]{"zhangsan","lisi","wangwu"};
String[] namesArr = {"zhangsan","lisi","wangwu"};

練習3:

定義陣列儲存4個學生的身高。

1.給陣列限定什麼型別? double
2.利用靜態初始化完成建立並新增元素
double[] heightsArr = new double[]{1.85,1.82,1.78,1.65};
double[] heightsArr = {1.85,1.82,1.78,1.65};

4.地址值

int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@6d03e736

double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2

列印陣列的時候,實際出現的是陣列的地址值。

陣列的地址值:就表示陣列在記憶體中的位置。

以[I@6d03e736為例:

[ :表示現在列印的是一個陣列。

I:表示現在列印的陣列是int型別的。

@:僅僅是一個間隔符號而已。

6d03e736:就是陣列在記憶體中真正的地址值。(十六進位制的)

但是,我們習慣性會把[I@6d03e736這個整體稱之為陣列的地址值。

地址值對於我們來京,作用不大,簡單瞭解。

5.陣列元素訪問

格式:

​ 陣列名[索引];

作用:

  • 獲取陣列中對應索引上的值
  • 修改陣列中對應索引上的值

    一旦修改之後,原來的值就會被覆蓋了。

程式碼示例:

public class ArrDemo2 {
    /*

        陣列中元素訪問的格式:
                陣列名[索引];

         作用:
            1.獲取指定索引上對應的元素
            2.修改指定索引上對應的元素


    */
    public static void main(String[] args) {
       int[] arr = {1,2,3,4,5};
       //需求1:獲取arr陣列中,3索引上的值
        int number = arr[3];
        System.out.println(number);
        System.out.println(arr[3]);

       //需求2:將arr陣列中,3索引上的值修改為10
            arr[3] = 10;
        System.out.println("修改之後為:" + arr[3]);

    }
}

6.索引

​ 也叫角標、下標

​ 就是陣列容器中每一個小格子對應的編號。

索引的特點:

  • 索引一定是從0開始的。
  • 連續不間斷。
  • 逐個+1增長。

7.陣列的遍歷

遍歷:就是把陣列裡面所有的內容一個一個全部取出來。

陣列的長度:陣列名.length;

通用程式碼:

for(int i = 0; i < arr.length; i++){
    //在迴圈的過程中,i依次表示陣列中的每一個索引
    sout(arr[i]);//就可以把陣列裡面的每一個元素都獲取出來,並列印在控制檯上了。
}

8.陣列的動態初始化

格式:

​ 資料型別[] 陣列名 = new 資料型別[陣列的長度];

舉例:

//1.定義一個陣列,存3個人的年齡,年齡未知
int[] agesArr = new int[3];


//2.定義一個陣列,存班級10名學生的考試成績,考試成績暫時未知,考完才知道。
int[] scoresArr = new int[10];

陣列的預設初始化值:

整數型別:0

小數型別:0.0

布林型別:false

字元型別:'\u0000'

引用型別:null

9.陣列兩種初始化方式的區別

靜態初始化:int[] arr = {1,2,3,4,5};

動態初始化:int[] arr = new int[3];

靜態初始化:手動指定陣列的元素,系統會根據元素的個數,計算出陣列的長度。

動態初始化:手動指定陣列長度,由系統給出預設初始化值。

使用場景:

只明確元素個數,但是不明確具體的資料,推薦使用動態初始化。

已經明確了要操作的所有資料,推薦使用靜態初始化。

舉例:

  • 使用陣列來儲存鍵盤錄入的5個整數。

    int[] arr = new int[5];

  • 將全班的學生成績存入陣列中,已知學生成績為:66,77,88,99,100

    int[] arr = new int[5];

    arr[0] = 66;

    arr[1] = 77;

    ... 雖然可以實現,但是太麻煩了。

    建議使用靜態初始化:int[] arr = {66,77,88,99,100};

10.陣列常見問題

當訪問了陣列中不存在的索引,就會引發索引越界異常。

避免:

​ 針對於任意一個陣列,索引的範圍:

   最小索引:0
   最大索引:陣列的長度 - 1

​ 陣列名.length - 1

public class ArrDemo6 {
    public static void main(String[] args) {
       int[] arr = {1,2,3,4,5,5,5,5,5};
        //用索引來訪問陣列中的元素
        System.out.println(arr[1]);
        System.out.println(arr[10]);//ArrayIndexOutOfBoundsException

    }
}

11.陣列的練習

練習1:求和

需求:定義一個陣列,儲存1,2,3,4,5

遍歷陣列得到每一個元素,求陣列裡面所有的資料和

程式碼示例:

/*定義一個陣列,儲存1,2,3,4,5
        遍歷陣列得到每一個元素,求陣列裡面所有的資料和*/


//分析:
//1.定義一個陣列,並新增資料1,2,3,4,5
int[] arr = {1,2,3,4,5};

//求和變數
int sum = 0;
//2.遍歷陣列得到每一個資料,累加求和
for (int i = 0; i < arr.length; i++) {
    //i 依次表示陣列裡面的每一個索引
    //arr[i] 依次表示陣列裡面的每一個元素
    sum = sum + arr[i];
}

//當迴圈結束之後,sum的值就是累加之後的結果
System.out.println(sum);

練習2:統計個數

需求:定義一個陣列,儲存1,2,3,4,5,6,7,8,9,10

遍歷陣列得到每一個元素,統計陣列裡面一共有多少個能被3整除的數字

程式碼示例:

//分析:
//1.定義一個陣列 儲存1,2,3,4,5,6,7,8,9,10
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//定義一個變數,用來統計次數
int count = 0;
//2.遍歷陣列得到每一個元素
for (int i = 0; i < arr.length; i++) {
    //i 表示陣列裡面的每一個索引
    //arr[i] 表示陣列裡面的每一個元素
    //3.判斷當前的元素是否為3的倍數,如果是那麼統計變數就需要自增一次。
    if(arr[i] % 3 == 0){
        // System.out.println(arr[i]);
        count++;
    }
}
//當迴圈結束之後,就表示陣列裡面所有的數字都判斷完畢了,直接列印count即可
System.out.println("陣列中能被3整除的數字有" + count + "個");

練習3:變化資料

需求:

定義一個陣列,儲存1,2,3,4,5,6,7,8,9,10

遍歷陣列得到每一個元素。

要求:

1,如果是奇數,則將當前數字擴大兩倍

2,如果是偶數,則將當前數字變成二分之一

程式碼示例:

//分析:
//1.定義一個陣列,存1,2,3,4,5,6,7,8,9,10
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//2.遍歷陣列得到每一個元素
for (int i = 0; i < arr.length; i++) {
    //i 依次表示陣列裡面的每一個索引
    //arr[i] 依次表示陣列裡面的每一個元素
    //3.對每一個元素進行判斷
    if(arr[i] % 2 == 0){
        //偶數 變成二分之一
        arr[i] = arr[i] / 2;
    }else{
        //奇數 擴大兩倍
        arr[i] = arr[i] * 2;
    }
}

//遍歷陣列
//一個迴圈儘量只做一件事情。
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

練習4:求最值

需求:求陣列中的最大值

程式碼示例:

//定義陣列求最大值:33,5,22,44,55

//擴充套件問題:
//1.根據求最大值的思路,自己改寫一下求最小智
//2.為什麼max要記錄為arr[0],預設值不能為0嗎?
//不能寫0
//max的初始化值一定要是陣列中的值。
//3.迴圈中開始條件一定是0嗎?
//迴圈的開始條件如果為0,那麼第一次迴圈的時候是自己跟自己比了一下,對結果沒有任何影響,但是效率偏低
//為了提高效率,減少一次迴圈的次數,迴圈開始條件可以寫1.


//1.定義陣列用來儲存5個值
int[] arr = {33,5,22,44,55};
//2.定義一個變數max用來儲存最大值
//臨時認為0索引的資料是最大的
int max = arr[0];
//3.迴圈獲取陣列中的每一個元素
//拿著每一個元素跟max進行比較
for (int i = 1; i < arr.length; i++) {
    //i 索引  arr[i] 元素
    if(arr[i] > max){
        max = arr[i];
    }
}
//4.當迴圈結束之後,max記錄的就是陣列中的最大值
System.out.println(max);//55

練習5:統計個數

需求:生成10個1~100之間的隨機數存入陣列。

1)求出所有資料的和

2)求所有資料的平均數

3)統計有多少個資料比平均值小

程式碼示例:

//分析:
//1.定義陣列
int[] arr = new int[10];
//2.把隨機數存入到陣列當中
Random r = new Random();

for (int i = 0; i < arr.length; i++) {
    //每迴圈一次,就會生成一個新的隨機數
    int number = r.nextInt(100) + 1;
    //把生成的隨機數新增的陣列當中
    //陣列名[索引] = 資料;
    arr[i] = number;
}


// 1)求出所有資料的和
//定義求和變數
int sum = 0;
for (int i = 0; i < arr.length; i++) {
    //迴圈得到每一個元素
    //並把元素累加到sum當中
    sum = sum + arr[i];
}
System.out.println("陣列中所有資料的和為:" + sum);


//2)求所有資料的平均數
int avg = sum / arr.length;
System.out.println("陣列中平均數為:" + avg);



//3)統計有多少個資料比平均值小
int count = 0;
for (int i = 0; i < arr.length; i++) {
    if(arr[i] < avg){
        count++;
    }
}

//當迴圈結束之後,就表示我已經找到了所有的比平均數小的資料
System.out.println("在陣列中,一共有" + count + "個資料,比平均數小");



//遍歷陣列,驗證答案
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

練習6:交換資料

需求:定義一個陣列,存入1,2,3,4,5。按照要求交換索引對應的元素。

交換前:1,2,3,4,5

交換後:5,2,3,4,1

程式碼示例:

//1.定義陣列儲存資料
int[] arr = {1,2,3,4,5};
//2.利用迴圈去交換資料
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
    //交換變數i和變數j指向的元素
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
//當迴圈結束之後,那麼陣列中的資料就實現了頭尾交換
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

練習7:打亂資料

需求:定義一個陣列,存入1~5。要求打亂陣列中所有資料的順序。

程式碼示例:

//1.定義陣列儲存1~5
int[] arr = {1, 2, 3, 4, 5};
//2.迴圈遍歷陣列,從0索引開始打亂資料的順序
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
    //生成一個隨機索引
    int randomIndex = r.nextInt(arr.length);
    //拿著隨機索引指向的元素 跟 i 指向的元素進行交換
    int temp = arr[i];
    arr[i] = arr[randomIndex];
    arr[randomIndex] = temp;
}
//當迴圈結束之後,那麼陣列中所有的資料已經打亂順序了
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

相關文章