1. 程式人生 > >Java一維陣列定義和初始化、二維陣列定義和初始化、傳參方式、Arrays類

Java一維陣列定義和初始化、二維陣列定義和初始化、傳參方式、Arrays類

陣列

陣列是Java中的一種資料型別,是一組資料的集合,陣列中的每個成員稱為元素。Java中的陣列是類型別(引用型別),Java的同一個陣列中,只能存放相同型別的資料元素。

一維陣列
  • 一維陣列的定義方式
    一維陣列有以下兩種定義方式,推薦使用第一種定義方式
    <資料型別>[] <陣列名稱>;
    <資料型別> <陣列名稱>[];
    在沒有初始化時,定義陣列是不能指定長度!也就是說陣列不能使用。
    int[4] array;//錯誤
    其中<資料型別>決定這該陣列中元素型別(陣列名稱[0]所表示的元素型別)。所以<資料型別>不僅可以代表基本資料型別,還可以代表類型別(引用型別)。
    Java程式在定義陣列時並不為陣列元素分配記憶體空間,只為<陣列名>提供一個引用空間(實際上就是指標)。
  • 用new關鍵字動態初始化建立一維陣列物件(前提是<陣列名稱已經被定義為元素型別>)
	<陣列名稱> = new <陣列元素型別>[整型常量];

在這個過程中,使用new關鍵字來產生陣列的例項物件。
這樣例項化以後,就可以用 <陣列名稱>.length得到陣列的長度屬性。
[整形常量]是陣列元素的長度,下標由0開始到[整形常量-1。]在堆空間中申請一個大小為陣列元素型別(定義陣列時的資料型別)乘以整形常量(陣列元素佔用記憶體空間乘以陣列元素個數)的記憶體空間。並且對堆空間空間中的所有元素預設初始化(對整形變數置0、浮點變數置0.0、boolean型別變數置false、並對類型別的變數置null(字串變數置null))。
這裡以如下程式碼為例
int[] array[4] = new int[4];


new產生int[4]的記憶體過程

array的型別是一個指向型別為int的堆空間的指標
array的值是堆空間陣列元素首地址的地址值。
array陣列的四個元素值均為0

  • 一維陣列初始化
    一般定義時直接初始化。
    未使用new關鍵字靜態初始化(其中包括了定義過程)建議使用第一種。
    <資料型別>[] <陣列名稱> = {<陣列元素資料型別的值>, <陣列元素資料型別的值>, ……};
    <資料型別> <陣列名稱>[] = {<陣列元素資料型別的值>, <陣列元素資料型別的值>, ……};
    靜態初始化實際上預設使用了new關鍵字,只不過陣列長度和陣列元素值已經被{}中的資料所確定。
    Java編譯程式會將初始化中{}內的資料個數作為陣列的元素個數。
	int[] a = new int[3];
	int[] b =a;

這裡的陣列b定義後初始化為a陣列所指向的空間,也代表了陣列a的length屬性。b可以引用並改變a的陣列元素。

	int[] a;
	a = new int[] {<陣列元素資料型別的值>, <陣列元素資料型別的值>, ……};

用這種方式定義和初始化陣列,陣列元素個數由<陣列元素資料型別的值>的個數確定。元素值分別為<陣列元素資料型別的值>所確定。注意這裡的int[]為型別定義,[]內不能寫數字。

二維陣列

Java中的二維陣列實際上可以看作是二維陣列的每個一維元素是一維陣列。

  • 二維陣列的定義及其動態初始化方式(推薦使用第一種,更加明確陣列型別)
	<型別>[][] <陣列名稱> = new <型別>[<二維陣列列個數>][<二維陣列行個數>];
	<型別> <陣列名稱>[][] = new <型別>[<二維陣列列個數>][<二維陣列行個數>];

這種方式會在堆記憶體空間中,申請陣列元素空間並對其預設初始化(類型別置null、整形置0、浮點置0.0、boolean置false)。

  • 二維陣列定義及其靜態初始化(推薦使用第一種)
	<型別>[][] <陣列名稱> = {{<該型別常量>, <該型別常量>}, {<該型別常量>}};
	<型別> <陣列名稱>[][] = {{<該型別常量>, <該型別常量>}, {<該型別常量>}};

以此為例,該二維陣列<陣列名稱>[0]中有兩個元素,<陣列名稱>[1]有一個元素。每個一維形式的陣列的元素值和個數根據{}內中的元素值和個數確定。

  • 陣列元素的訪問方式

陣列的每個都有一個索引(下標),陣列中的第一個元素的索引是0,最後一個元素的索引是陣列元素個數-1,依次遞增一。
二維陣列的最後一個元素<二維陣列名稱>[<二維陣列名.length - 1>][<二維陣列名[二維陣列名.length - 1].length - 1>]
陣列的length屬性表示陣列元素個數,它被宣告為
public int length;
length屬性被public和final聯合修飾,所以程式中可以獲得陣列長度,但不能修改陣列長度。

  • 傳參的方式(引數的傳遞方式)
    引數傳遞涉及實際引數和形式引數。
    實際引數:當方法實行時,方法實際上所使用的引數。
    形式引數:呼叫方法時用到的內部變數名稱。定義方法時所用的引數。
    實際引數的型別必須和定義時的形式引數的型別保持一致(實際上在涉及類型別中的繼承關係時,可以用子類型別的物件作為實參來呼叫形參型別的父類物件)。當含有多個形參時,實參形參型別順序必須一一對應。
    引數在傳遞中實際上只有一種方式,就是值傳遞。所謂的地址傳遞,實際上是指指標的值,也是值傳遞的方式。
    Java程式中呼叫含有引數的方法時,當方法形式引數是基本資料型別時,將該基本資料型別變數或者表示式或者常量的值複製的結果,所以該方法{}內對實參的賦值不影響呼叫方法時作為實參的變數或者表示式的值。(常量不存在被賦值的操作)
  • Arrays類

Java程式中的工具包,將工具包內的構造方法私有話,這樣就保護了工具,所以不能用new Arrays();而直接用Arrays.<方法名稱>;來實現Arrays類中所提供的相關邏輯處理。
陣列的使用為Java程式提供了較高效率的儲存和訪問資料的一種方式,然而要解決一般化的問題我們僅僅使用陣列就不能高效地完成(例如排序等操作)。
Arrays類屬於java.util包,其中包含了一套static方法,提供運算元組地使用功能,可以對Java陣列進行資料查詢、排序等功能。
對於數型別的陣列,一般存在如下基本操作

方法名稱 邏輯功能
sort() 對指定陣列進行排序
binarySearch() 已排序陣列進行二元搜尋,如果找到指定值就返回該值所在的索引(下標),未找到就返回負值
fill() 將陣列中的所有元素設定為指定值
equals() 比較兩個陣列的陣列元素型別和值是否完全一致返回值為boolean

用Arrays.<方法名>(<陣列名>);等方式來使用工具類中提供的方法。