1. 程式人生 > 實用技巧 >Java 之 一維陣列

Java 之 一維陣列

一、宣告與初始化一維陣列

  1、宣告(兩種方式)

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

    陣列元素型別:決定了陣列的資料型別,即陣列要存放什麼型別的資料,可以是基本資料型別和引用資料型別;

    Java語言中宣告陣列時不能指定其長度(陣列中元素的數), 例如: int a[5]; //非法
    Demo:

int a[];
int[] a1;
double b[];
String[] c; //引用型別變數陣列

  

  2、初始化(兩種方式)

     陣列的初始化:在記憶體當中建立一個數組,並且向其中賦予一些預設值,再用 new 運算子進行記憶體分配。

     兩種初始化方式:

    (1)動態初始化(指定長度):陣列宣告且為陣列元素分配空間與賦值的操作分開進行

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

      資料型別:也就是陣列當中儲存的資料,全都是統一的什麼型別,與宣告時要一致;

       陣列長度:也就是陣列當中,到底可以儲存多少個數據,是一個int數字;

       注意:陣列有定長特性,陣列一旦初始化完成,其長度就確定了,不可更改。

    (2)靜態初始化(指定內容):在定義陣列的同時就為陣列元素分配空間並賦值。

陣列名稱 = new 資料型別[]{元素1,元素2,……};

      注意:雖然靜態初始化沒有直接告訴長度,但是根據大括號裡面的元素具體內容,也可以自動推算出來長度。

      Demo:

    int[] ids;//宣告
    //1.1 靜態初始化:陣列的初始化和陣列元素的賦值操作同時進行
    ids = new int[]{1001,1002,1003,1004};
    //1.2動態初始化:陣列的初始化和陣列元素的賦值操作分開進行
    String[] names = new String[5];

  

  3、宣告並初始化陣列

    宣告的同時使用 new 關鍵字為陣列分配記憶體空間:

資料型別 陣列名字 = new 陣列元素的型別[陣列元素的個數]
資料型別 陣列名字 = new 陣列元素的型別[元素1,元素2,……]

    注意使用 new 關鍵字分配陣列時,必須指定陣列元素的型別陣列元素的個數陣列元素

  4、省略new的方式(型別推斷)

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

    使用這種方式,會根據元素型別推斷中所建立的陣列中的資料型別,此時宣告和初始化必須在同一行!

  Demo:

int[] arr = {1,2,3,4,5};//型別推斷

int[] arr2;
arr2 = {1,2,3,4,5};  //編譯不通過,這樣必須寫在同一行

  

二、一維陣列的訪問與陣列長度

  1、列印陣列名稱

    當使用 System.out.println 列印陣列的名稱時,得到的陣列對應的:陣列物件的型別@記憶體地址雜湊值。(十六進位制的地址值)

    Demo:

int[] arr2 = new int[3];
System.out.println(arr2);     //結果是:[I@6d06d69c

  2、陣列的長度

    每個陣列都具有長度,而且是固定的,Java中賦予了陣列的一個屬性,可以獲取到陣列的 長度,語句為:陣列名.length,屬性length的執行結果是陣列的長度,int型別結果。

    由次可以推斷出,陣列 的最大索引值為陣列名.length-1

    注意:陣列一旦初始化,其長度是不可變的。

  3、訪問陣列中的元素

    定義並用運算子new為之分配空間後,才可以引用陣列中的每個元素
    索引(下標):每一個儲存到陣列的元素,都會自動的擁有一個編號,從0開始,這個自動編號稱為陣列索引 (index),可以通過陣列的索引訪問到陣列中的元素;

      陣列元素下標可以是整型常量或整型表示式。如a[3] , b[i] , c[6*i];
      陣列元素下標從0開始;長度為n的數組合法下標取值範圍: 0 —>n-1int a[]=newint[3]; 可引用的陣列元素為a[0]a[1]a[2]
    格式:

陣列名[索引] = 數值,     //為陣列中的元素賦值
變數 = 陣列名[索引]       //獲取出陣列中的元素

三、遍歷陣列

  陣列遍歷就是將陣列中的每個元素分別獲取出來,就是遍歷。遍歷也是陣列操作中的基石。  

  方式一:使用索引下標方式

1 int[] array = { 15, 25, 30, 40, 50, 60, 75 };
2 System.out.println(array[0]); // 15
3 System.out.println(array[1]); // 25
4 System.out.println(array[2]); // 30
5 System.out.println(array[3]); // 40
6 System.out.println(array[4]); // 50
7 System.out.println(array[5]); // 50

    這種方式需要依次根據索引進行頻繁重複的操作,不推薦使用,只做瞭解。

  方式二:使用for

int[] arr = new int[5];
for(int i = 0;i < arr.length;i++){
    System.out.println(arr[i]);
}

    對於一個數組,每次對每個元素的操作都是相同的,用迴圈是最好的方法。而且就算陣列的長度傳送了改變程式碼也不需要改動。

  方式三:使用 foreach 迴圈

1 for (int i: array){
2      System.out.println(array[i]);
3 }

   這種迴圈是增強形式的 for 迴圈,其中 i 即代表陣列中的每一個元素。

四、陣列元素的預設初始化值

    陣列是引用型別,它的元素相當於類的成員變數,因此陣列一經分配空間,其中的每個元素也被按照成員變數同樣的方式被隱式
初始化。

    對於基本資料型別而言,預設初始化值各有不同;

    對於引用資料型別而言,預設初始化值為null(注意與0不同!)
    

    整數型別:預設是 0;

    浮點型別:預設是 0.0;

    字元型別:預設為 '\u0000',字元編碼為0的空字元;

    布林型別:預設是 false;

    引用型別:預設是 null。

    注意:靜態初始化其實也有預設值的過程,只不過系統自動馬上將預設值替換成為了大括號當中的具體數值。

五、一維陣列的記憶體解析

  1、記憶體概述

    記憶體是計算機中的重要原件,臨時儲存區域,作用是執行程式。我們編寫的程式是存放在硬碟中的,在硬碟中的程 序是不會執行的,必須放進記憶體中才能執行,執行完畢後會清空記憶體。

    Java虛擬機器要執行程式,必須要對記憶體進行空間的分配和管理。

  2、Java 虛擬機器的記憶體劃分

    為了提高運算效率,就對空間進行了不同區域的劃分,因為每一片區域都有特定的處理資料方式和記憶體管理方式。

    JVM 的記憶體劃分:

    

             

  3、陣列在記憶體中的儲存

    (1)一個數組與記憶體關係

    

   程式執行流程:

    a、main 方法進入方法棧執行;

    b、建立陣列,JVM會在堆記憶體中開闢空間,儲存陣列;

    c、陣列在記憶體中會有自己的記憶體地址,以十六進位制數表示;

    d、陣列中有3個元素,預設值為 0

    e、JVM 將陣列的記憶體地址賦值給引用變數 array;

    f、變數 array 儲存的是陣列記憶體中的地址,而不是一個具體是數值,因此稱為引用資料型別;

  (2)兩個陣列與記憶體關係 

    

  (3)兩個變數指向一個數組

    

  4、陣列記憶體圖

    (1)宣告陣列型別

      

    (2)陣列的預設值

      

    (3)陣列的動態初始化

      

  5、陣列記憶體案例

    (1)案例一

      

    (2)案例二

      

    (3)案例三