Java學習總結之陣列(整理分享)

2022-04-01 13:00:28
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於陣列的相關問題,包括了為什麼要使用陣列、陣列的定義、陣列的初始化以及陣列的基本操作等等,希望對大家有幫助。

推薦學習:《》

一、為什麼要使用陣列以及陣列的定義

1.1 為什麼使用陣列

問題1:

宣告變數時,每一個單獨的變數都要對應一個變數名,但現在要處理一組相同型別的資料時,如要表示班上100個人的年齡,絕對不希望定義100個變數來表示每個人的年齡,那怎麼辦呢?再看下列例子。

int age = 17;//表示一個年齡

問題2:

求兩個數之和,需要一個方法,求5個數之和,需要過載一個方法,求100個數之和、1000個數之和、10000個數之和,方法的參數列會很長很長,而且方法得有很多個,而且還得去記住哪個方法是兩個引數的,哪個方法是三個引數的。這樣總感覺很不爽,仔細分析這個功能,其實就是求一組數值的和而已,這個方法並不在乎具體是多少個加數,它只在乎需要把哪些數加起來。

大師的建議:定義方法的形參時,最好不好超過5個。

1.2 什麼是陣列

簡單來講就是一組資料,一堆資料。所謂陣列是在程式設計中為了處理方便,把具有相同型別若干變數按有序的形式組織起來的一種資料形式。這些按一定順序排列的同型別資料的集合稱為陣列。而陣列中的每一個資料稱之為陣列元素,陣列中的元素以索引來表示其存放的位置,索引從0開始,步長是1,有點像Excel表格的行號逐行遞增。

1.3 陣列的定義

方式1(推薦使用): 陣列元素的型別[] 陣列名; eg:int[] ages;

可以把int[]看成是一種資料型別,int型別的陣列型別。

方式2:陣列元素的型別 陣列名[]; eg: int ages[];

注意:陣列必須先初始化才能使用。因為初始化表示在記憶體中分配空間

二、陣列的初始化

Java中陣列必先初始化後才能使用所謂初始化就是給陣列元素分配記憶體,併為每個元素賦初始值。

初始化陣列的兩種方式分為靜態初始化動態初始化;無論以哪種方式初始化陣列一旦初始化完成,陣列的長度就固定了,除非重新初始化。也就是說陣列是定長

陣列是定長的:陣列一旦初始化成功,陣列中的元素個數就已經固定了,不能更改。如果需要更改,只能重新做初始化。

2.1 陣列的靜態初始化

由我們自己來為每一個陣列元素設定初始化值,而陣列的長度由系統(JVM)決定。

語法:

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

舉例:

int[] nums = new int[]{1,3,5,7,9};

簡單寫法,必須宣告之後立刻初始化,不能先宣告後初始化; int[] nums = {1,3,5,7,9};

圖解陣列靜態初始化操作及重新賦值操作

2.2 陣列的動態初始化

由我們來設定陣列的元素個數(陣列長度),而每一個陣列元素的初始值由系統決定。

語法:

陣列元素型別[] 陣列名 = new 陣列元素型別[ length ];

舉例:

    int[] ages = new  int[
100
];

注意:int[] nums = new int[5]{1,3,5,7,9};//寫法是錯誤的。不能同時使用靜態初始化和動態初始化

2.3 什麼時候使用靜態初始化,什麼時候使用動態初始化呢?

當我們事先知道需要儲存哪一些資料的時候,選用靜態初始化

當我們事先不知道,需要儲存哪些資料的時候,只能使用動態初始化

Java中給資料型別設定了初始值,如下圖:

資料型別

初始值

byte、short、int

0

long

0L

float

0F

double

0.0D

boolean

false

char

’\u0000‘ (表示空)

參照資料型別

null

三、陣列基本操作(一維陣列)

3.1 陣列基本操作:

  • 獲取元素: 元素型別 變數 = 陣列名[index];
  • 設定元素: 陣列名[index] = 值;
  • 遍歷陣列元素: 建議使用for迴圈,因為for迴圈事先知道迴圈的次數
  • 陣列長度: int len = 陣列名.length; length是屬性,不是方法.
  • 索引範圍: 從0開始,逐一遞增。 [0,陣列名.length-1]

3.2 運算元組常見異常:

NullPointerException:空指標異常(空參照)。

出現該異常的原因:當陣列還未初始化,就直接運算元組

如以下程式碼:

String[] bs = null;

System.out.println(bs.length)

ArrayIndexOutOfBoundsException:陣列的索引越界異常。

出現該異常的原因:根據索引取出資料元素時,輸入了超出陣列索引範圍之外的值。

如下程式碼:

int[] nums = {1,3,5,7,9};

int a = nums[4];

3.3 獲取陣列最大最小元素

/**
 * 求陣列最大值
 *
 * @param nums
 * @return
 */
public static int getMax(int[] nums) {
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        int num = nums[i];
        if (result < num) {
            result = num;
        }
    }
    return result;
}

/**
 * 求資料最小值
 *
 * @param nums
 * @return
 */
public static int getMin(int[] nums) {
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        int num = nums[i];
        if (i == 0) {
            result = num;
        }
        if (result > num) {
            result = num;
        }
    }
    return result;
}

3.4 列印陣列元素

當我們直接使用System.out.println()列印陣列的時候,列印出來是hashCode值,如

int[] nums = new int[]{1, 3, 5, 7, 9};

System.out.println(nums);

我們不喜歡,我們想列印陣列的時候,把該陣列的元素列印出來,這時需要回圈遍歷列印

int[] nums = new int[]{1, 3, 5, 7, 9};
for (int i = 0; i < nums.length; i++) {
    System.out.print(nums[i] + " ");
}

但是呢,每次想列印資料中的元素都還要回圈遍歷一遍,好麻煩啊! 有沒有更好的方式呢?其實不用著急,Java前輩們已經幫我們想到了這一點了,我們只需要呼叫Arrays.toString()方法就能夠對陣列進行列印

3.5 逆序排列陣列元素

例子:原陣列[A, B, C, D, E],要求對該陣列進行逆序操作得到新陣列:[E, D, C, B, A]。

public static String[] reversedOrder(String[] nums) {
    String[] result = new String[nums.length];
    int index = 0;
    for (int i = nums.length - 1; i >= 0; i--) {
        result[index] = nums[i];
        index++;
    }
    return result;
}

3.6 線性搜尋:元素出現索引(第一次/最後一次)

陣列的線性搜尋指得就是挨個遍歷,查詢陣列中與key相同的元素,若查詢不到則可以返回-1(慣例,自定義),其效率為O(n)。

例子:int[] arr = {10,20,30,10,50,-30,10};獲取元素10在arr陣列中第一次出現的索引和最後一次出現的索引

/**
 * 獲取陣列中指定元素第一次出現的索引
 *
 * @param nums
 * @param element
 * @return
 */
public static int indexOf(int[] nums, int element) {
    for (int i = 0; i < nums.length; i++) {
        if (element == nums[i]) {
            return i;
        }
    }
    return -1;
}

/**
 * 獲取陣列中指定元素最後一次出現的索引
 *
 * @param nums
 * @param element
 * @return
 */
public static int lastIndexOf(int[] nums, int element) {
    for (int i = nums.length - 1; i >= 0; i--) {
        if (element == nums[i]) {
            return i;
        }
    }
    return -1;
}

四、多維陣列

在前面的文章中我們有提到陣列其實就是是多個資料的集合。如果現在有多個陣列,我想把多個陣列儲存在一個集合中,此時我又應該如何完成呢?此時就需要引入多維陣列的概念。多維陣列其實就是把整個陣列看成一個元素,存放到另一個陣列當中去

多維陣列的語法:

陣列元素型別[] 陣列名;

例如如下定義二維陣列的格式

int[][]  arr = new int[][]   {

  arr1 ,arr2,arr3

};

int[][]  arr = new int[][]   {

  {1,2,3} ,

  {4,5},

  {6}

};

4.1 多維陣列和一維陣列的區別

  • 一維陣列:陣列中的每一個元素都是一個值(基本型別和參照型別的值);
  • 二維陣列:陣列中的每一個元素又是一個一位陣列;
  • 三維陣列:陣列中的每一個元素又是一個二維陣列;

注意:嚴格上說在Java中不存在多維陣列的概念。為了和C語言做區分一般稱之為陣列中的陣列

4.2 二維陣列的初始化操作

靜態初始化

int[][] arr = new int[][] {

{1,2,3} ,

{4,5},

{6}

};

動態初始化

int[][] arr = new int[3][5] ;//建立一個長度為3的二維陣列,每一個元素(一維陣列)的長度為5。

針對於N維陣列,需要N個迴圈巢狀。

五、Java5對陣列的新語法支援

Java5對陣列的新語法支援主要是增強for迴圈(foreach)方法的可變引數

5.1 增強for迴圈-foreach

在之前我們使用for迴圈的列印元素操作如下

int[] nums = new int[]{1, 3, 5, 7, 9};
for (int i = 0; i < nums.length; i++) {
    System.out.println(nums[i]);
}

其實我們在使用迴圈迭代陣列的時候,往往是不關心迭代變數(陣列的索引)。那在Java中有沒有更好的方式,在迭代陣列元素的時候就只運算元組元素,不去運算元組的索引呢?其實是有的。

從Java5開始(JDK1.5)開始,Java提供了一種新的語法:增強for迴圈(foreach)。

語法:

for(陣列元素型別 變數 : 陣列名)

{

迴圈體

}

我們通過反編譯工具檢視位元組碼,會發現foreach其實在底層依然是使用for迴圈+索引來運算元組的。我們把增強for迴圈稱之為編譯器的新特性---->語法糖

注意:語法糖的最大甜頭就是讓開發者寫更少、更簡單的程式碼,完成相同的功能。當我們在迭代陣列元素的時候不關心陣列的索引的時,首選使用foreach。當然咯,foreach遠遠沒有本篇部落格講解的這麼簡單,星仔到時候帶著大家在集合框架篇的時候再深入講解foreach。

5.2 方法的可變引數

Java5的時候為什麼要增加可變引數呢?我們來看一下以下的需求

需求:編寫一個方法,統計使用陣列傳遞過來的總和。

雖然說也是可以實現,但是我們心裡肯定是不爽的,主要在於以下幾點:

  • 為了求多個數之和,我們還得先建立一個陣列來儲存資料。
  • 如果多個數是變化的,比如求3個數之和變成求5個數之和.......,還得去修改定義陣列,但是陣列是定長的。

那如果要解決該問題該怎麼辦呢?這個時候就需要引入Java5的另一個新特性:方法的可變引數(說的是引數的個數可變)

注意:

  • 方法的可變引數其實也是一個語法糖,是編譯器級別的新特性。主要是為了讓開發者寫程式碼更簡單。
  • 方法的可變引數其底層是就是一個陣列型別
  • 可變引數必須作為方法的最後一個引數,避免引數的歧義性。
  • 一個方法最多隻有一個可變引數

六、陣列元素拷貝

陣列拷貝:從指定源陣列中複製一個陣列,複製從指定的位置開始,到目標陣列的指定位置結束。

  • 從 src 參照的源陣列到 dest 參照的目標陣列,陣列元件的一個子序列被複制下來。
  • 被複制的元件的編號等於 length 引數。
  • 源陣列中位置在 srcPos 到 srcPos+length-1 之間的元件被分別複製到目標陣列中的 destPos 到 destPos+length-1 位置。

陣列拷貝操作是經常使用到的,SUN就直接把陣列的拷貝操作存放在JDK中的System類中

Object:Java語言中的根類。是所有類的老祖宗。Object可以表示任意資料型別。

該方法沒有方法體,該方法使用了native修飾符(本地方法)。該方法底層使用了C/C++語言實現了,Java直接呼叫其他語言編寫好的功能

arraycopy 方法使用方式

System.arraycopy(src, 2, dest, 5, 4);

查閱API檔案了(Java的幫助檔案/好比字典),在什麼類中有什麼功能的方法即可。檔案在手,天下我有!

推薦學習:《》

以上就是Java學習總結之陣列(整理分享)的詳細內容,更多請關注TW511.COM其它相關文章!