1. 程式人生 > >Java 基礎 - 陣列

Java 基礎 - 陣列

目錄

  • 初識陣列
  • 陣列的初始化
    • 定義陣列變數
    • 初始化
  • 陣列的訪問
    • 陣列元素讀取、賦值
    • 陣列的遍歷
  • 深入瞭解陣列
    • JDK 中的 Array
    • 陣列的記憶體分佈
    • 多維陣列

陣列是程式語言中最常見的一種資料結構,可以用於儲存多個數據,通常可通過陣列元素的索引來訪問陣列元素,包括陣列元素賦值和取出陣列元素的值.

初識陣列

  • 陣列也是一種型別,屬於引用資料型別.
  • 陣列元素的型別是唯一的,一個數組裡只能儲存一種型別的資料.
  • 陣列的長度是固定的,即一個數組一單初始化完成,陣列在記憶體中所佔的空間將被固定下來,長度不在發生改變.即使把某個陣列的元素清空,其所佔的空間依然被保留.

陣列的初始化

定義陣列變數

Java支援兩種語法格式定義陣列:

type[] arr;
type arr[];

對於這兩種定義而言,通常使用第一種格式來定義陣列,因為第一種有更好的語義.第二種容易和變數名混淆

初始化

Java 陣列只有初始化之後才能使用,所謂的初始化,就是為陣列的元素分配記憶體空間.併為每個陣列元素賦初始值.

靜態初始化

由程式設計師顯示的指定每個陣列原始的初始值.由系統決定陣列的長度.

靜態初始化的語法格式為:

type[] arr = new type[]{item1, item2, item3,...};

type 為陣列元素的資料型別, 陣列元素型別必須為 type 型別,或者其子類的例項.
除此之外,靜態初始化還有如下簡化的語法格式:

type[] arr = {item1, item2, item3 ...};

動態初始化

動態初始化只指定陣列的長度,由系統為每個元素指定初始值,動態初始化的語法格式如下:

type[] arr = new type[length];

上面的語法中,需要指定一個 int 型別的 length 引數,這個引數指定了陣列的長度.
執行動態初始化時,程式設計師只指定陣列的長度,陣列元素的初始值由系統按照如下自動分配

  • 陣列元素型別是基本型別中的整數型別(byte, short, int, long),則陣列元素的值是 0.
  • 陣列元素型別是基本型別中的浮點型別(float, double),則陣列元素的值是 0.0.
  • 陣列元素型別是基本型別中的字元型別(char),則陣列元素的值是'\u0000'.
  • 陣列元素的型別是基本型別中的布林型別(boolean),則陣列元素的值是 false.
  • 陣列元素的型別是引用型別(類,介面,陣列),則陣列元素的值是 null;

陣列的訪問

陣列最常用的方法就是訪問陣列元素,包括對陣列元素進行賦值和取出陣列元素.

陣列元素讀取、賦值

int[] arr = {1,2,3};
// 陣列取值 通過 arr[index] 訪問 
int a = arr[0];
// arr 為{1,3,3}
arr[1] = 3

如果訪問陣列元素時指定的索引值小於0,或者大於等於陣列的長度,編譯程式時不會出現任何錯誤,但執行時出現異常java.lang.ArrayIndexOutOfBoundsException:N(陣列越界異常), N 就是試圖訪問的陣列索引.

陣列的遍歷

for 迴圈

int[] arr = new int[5];
// 輸出 5 個 0
for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i])
}
arr[1] = 1;
arr[2 = 2;
// 輸出 0 1 2 0 0
for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i])
}

上面的程式碼第一次迴圈輸出 5 個 0,因為 arr 陣列執行的是預設初始化,陣列元素是 int 型別,系統為 int 型別的陣列元素初始化賦值為 0.

foreach迴圈

Java5 之後,Java 提供了一種更簡單的迴圈:foreach迴圈,這種迴圈遍歷陣列和集合更加方便.

for (type item : array|collection){
    // 
}

使用foreach迴圈需要注意:

int[] arr = {1, 2, 3, 4, 5};
for (int item: arr){
    System.out.println(item);
    item = 0;
    System.out.println(item);
}
System.out.println(arr[0]);

上例程式將輸出

1
0
2
0
3
0
4
0
5
0
1

由輸出結果可以看出來,在 foreach迴圈中對陣列元素進行賦值,結果導致不能正確的遍歷陣列元素.同時在迴圈中為改變的陣列元素的值並沒有真正改變陣列元素,因為在 foreach中迴圈變數相當於一個臨時變數,系統會把陣列元素一次賦值給這個臨時變數,而這個臨時變數並不是陣列元素,它只是儲存了陣列元素的值.因此要注意:如果希望改變陣列元素的值,則不能使用這種 foreach 迴圈.

深入瞭解陣列

JDK 中的 Array

檢視 Java原始碼中的Array類可以發現它是個 final class, 其中方法如下:

Array類中基本都是 getXXsetXX 方法,
並且全部都為 native 方法.使用 native關鍵字說明這個方法是原生函式,也就是這個方法是用C/C++語言實現的,並且被編譯成了DLL,由java去呼叫,因此我們可以將陣列理解為是由計算機本地方法去實現的類,並不屬於 Java.

陣列的記憶體分佈

陣列是一種引用資料型別,陣列的引用變數時儲存在棧記憶體中的,而陣列元素是在堆記憶體中,並且是連續存放的.這是為了能快速存取陣列元素,因為只需要移動index(內部計算實體地址:陣列起始地址+index * 元素size大小)就可以訪問,而這是很快的 O(1)。

在Java 記憶體模型中,陣列物件被儲存在堆(heap)記憶體中;如果引用該陣列物件的變數是一個區域性變數,那麼它被儲存在棧(stack)記憶體中.如下圖所示:

如果需要訪問上圖堆記憶體中的陣列元素,在程式中只能通過 p[index]的形式實現.也就是說,陣列引用變數時訪問堆記憶體中陣列元素的根本方式.
現有如下程式碼:

// 定義並靜態初始化陣列
int[] a = {5, 7, 20};
// 定義陣列,使用動態初始化
int[] b = new int[4];
System.out.println("b 陣列的長度為: " + b.length);
// 迴圈輸出 a 陣列的元素
for (int i = 0, len = a.length; i < len; i++ ){
    System.out.println(a[i]);
}
// 迴圈輸出 b 陣列的元素
for (int i = 0, len = b.length; i < len; i++ ){
    System.out.println(b[i]);
}
// 將 a 的值賦給 b,即將 b 的引用指向 a 引用指向的陣列
b = a;
// 再次輸出 b 陣列的長度
System.out.println("b 陣列的長度為: " + b.length);

執行上例程式碼,首先會輸出 b 的長度為 4,然後輸出 a,b 的各項元素,接著輸出 b 的長度為 3.看起來陣列的長度是可變的,其實這是一個假象.
上例程式碼記憶體分析:

  1. 初始化 a,b 陣列,在記憶體中產生了 4 塊區域,棧中的引用變數 a,b 以及堆中的實際陣列物件. 其中 a 引用的陣列物件長度為 3, b 引用的陣列長度為 4.

  2. 程式執行b = a 操作.系統會將 a 的值賦給 b,即將 a 引用的陣列物件的記憶體地址賦給 b,此時 b 的值為 a 引用的陣列物件的記憶體地址.

從上可以看出,程式執行 b = a 之後,b 之前引用的陣列物件長度並沒有發生任何改變,而 b 的值變成了 a 引用的陣列物件的地址,此時 b 陣列的長度即為 a 陣列的長度 3.

需要注意的是陣列元素的記憶體空間是連續的,是指

  1. 如果陣列元素是原始型別,那麼陣列元素存放的就是原始型別的值,他們是連續存放的
  2. 如果陣列元素是物件,那麼陣列元素就是存放引用了,陣列元素是連續存放的,而引用的物件可能在另外的地方,與陣列元素可能相隔很遠,即不連續。

多維陣列

Java 提供了支援多維陣列的語法,但是從陣列底層的執行機制上來看,並不存在多維陣列.
多維陣列的定語語法為

type[][] arr = new type[length1][length2]

length2可動態建立.
二維陣列本質就是一位陣列中的每個元素都是一個一維陣列. 如上length2給出了值,則初始化了一維陣列中的每個元素都是一個長度為length2的一維陣列.其記憶體模型為:

相關推薦

java基礎----陣列

1.陣列宣告(不分配記憶體)     兩種格式:  eg: float a[];   或 float[] a;       int b[][];  &nbs

Java基礎——陣列佇列的原理和實現

1.陣列 1.1 陣列基本概念 陣列是一個容器,可以儲存同一資料型別的N個數據; 陣列是一個數據結構,是資料結構中訪問速度最快的; 陣列是直接通過下標進行定位; 陣列是屬於引用資料型別(陣列名中儲存的是記憶體首地址); 陣列本身只有有length屬性(獲取陣列能儲存的資料

Java基礎-----陣列排序

氣泡排序 兩個相鄰位置比較,如果前面的元素比後面的元素大就交換位置。每次外迴圈都能確定一個最大值在陣列中的位置。 package StringBufferPackage; public class Demo6_BubbleSort { public static void m

Java基礎-陣列練習-基礎演算法-清除整形陣列重複元素-

package 質數輸出練習; import java.util.*; public class 清除整形陣列重複元素 { public static void main(String[] args) { int[] arr = { 11, 2, 11, 2, 1

java基礎--陣列拼接排序

/** 需求: 實現兩個陣列組合並排序。 例如:arr1 = {1,10,7,5,100,78} arr2 = {99,54,2,46,28} 將兩個數組合併成一個數組,並且排序後輸出 思路: 1 定義兩個陣列,並賦值 2 定義第三個陣列,其長度等於前兩個陣列

小白的java基礎--------陣列、集合

1、陣列 資料型別[ ] 陣列名 = new 資料型別[ ]{}; int[ ] arr1 = new int [ 3 ];代表陣列中有3個元素 //代表陣列中有3個元素,索引從0開始 int[] arr = new int[3]; //向集合中新增元素 arr[1] = 12

Java基礎陣列(二維陣列行列倒置排序方法)

public class ReverseSortDemo02 { public static void main(String[] args) throws Exception { int da

Java-基礎 陣列的常用操作

Java-陣列的排序及元素查詢 intarray[] = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4}; 查詢具體位置: intindex = Arrays.binarySearch(array, 2); 排序陣列: Arrays.sort(arra

Java基礎---> 陣列

第一 一維陣列 一、概述: 1、定義:簡單來說,就是一個存放同種型別的容器。陣列中能放任意型別,但是同一個陣列中只能存放同一種資料。 2、使用陣列的好處:陣列可將其中的每一個值自動新增對應的編號,每個元素都有其對應的角標,方便與運算元組。 二、格式: 1、格式一

Java基礎--陣列和連結串列的區別

1、陣列                  陣列處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列

JAVA-基礎-陣列

一、陣列概念     陣列是長度固定內容可變的儲存多個同一型別資料的容器。   二、定義陣列     方式一:              這種方式定義的陣列,只定義了長度而沒有指定初始值,則初始值採用預設值。       數值型別為0,char型為 ‘a’,boolean型為false,引用型別為n

Java 基礎 - 陣列

目錄 初識陣列 陣列的初始化 定義陣列變數 初始化 陣列的訪問 陣列元素讀取、賦值 陣列的遍歷 深入瞭解陣列

java基礎 一維陣列

一維陣列 1.陣列的概念 (1)陣列 是個容器 儲存的是資料 儲存相同資料型別資料 陣列定義 資料型別[] 陣列名 = 初值 其中資料型別代表:陣列中盛放資料的 資料型別 int[] array = new int[5]; 陣列使用下標(角標)來訪問元素(儲存元素) 下

Java陣列定義與方法過載——有C++基礎Java入門(三)

目錄 一、 陣列的定義 1、定義 2、 原理 3、 賦值方式 二、Java的方法過載 1、 概念 (1) 過載 (2) 目的 2、例子 (1) 比較兩個數值的大小 (2) 執行方式及結果 一、 陣列的定義 1、定義 資料型別 [ ]&n

java基礎學習之函式、陣列

1、函式 1、函式的定義 函式是定義在類中有特定功能的一小段程式,也稱方法。定義格式: 修飾符 返回值型別 函式名(引數型別 形式引數1,引數型別 形式引數2, ) { 執行語句; return 返回值; } 2、功能 定義函式可以對功能程式碼進行封裝,提高程式碼的複用性

關於Java基礎的複習總結(三)陣列基礎知識

苟利程式碼生死已,豈因Bug避趨之 1、陣列: 用來存放相同型別的一組資料 2、初始化陣列: int nums[] ={3,4,5,6} int[] nums = new int[]{3,4,5,6} int[]nums=new int[5]; nums

Java基礎 - Java中的陣列

第一章 陣列的定義和賦值     1、陣列的含義和特點         含義:             用於存放多個相同

Java基礎之字串陣列Array進行去重

寫出一段演算法,用於對字串陣列進行去重,要求儘量簡潔 舉例: * 輸入: * {"cc","dd","aa","cc","gg","dd","ee"} * 輸出: * {"cc","dd","aa","gg","ee"} ArrayList去重 通過list.contains()

Java基礎 String 裸暴力演算法- 五個小練習 Java陣列直接選擇排序、sort()排序

  之間的部落格,承上啟下:    Java基礎 String/StringBuff 常用操作方法複習/記憶體分析 Java陣列直接選擇排序、sort()排序 Java基礎 String 演算法 - 五個練習題目要求: /** 1.模擬一個trim方法,去除

JAVA基礎(29)---二維陣列

二維陣列                               int[][]   陣列名稱  = new