Java語言基礎 #基礎語法 #Day5 #數組 #引用 #指針

一、數組的含義

數組: 是一種容器,可以同時存放多個數據值
特點

  1. 引用數據類型
  2. 數組中的數據,類型必須統一
  3. 數組的長度在程序運行期間不可改變

可以這樣想,數組就是一個冰箱(冰箱不屬於四類八種,所以是引用數據類型),裏面只能放食物(類型統一),容積一定(長度不可變)

二、數組的定義

數組有兩種常見的初始化方法:

  1. 動態初始化(指定長度)
  2. 靜態初始化(指定內容)

1. 動態初始化

數據類型[] 數組名稱 = new 數據類型[數組長度];
  1. 數據類型(左),指定保存的數據的類型
  2. [],代表是一個數組(區別於,定義變量之類)
  3. new 代表創建數組的動作
  4. 數據類型(右),要和左邊保持一致
  5. 數組長度是int數字

2. 靜態初始化

  • 基本格式:
數據類型[] 數組名稱 = new 數據類型[]{元素1, 元素2, ...};
  • 省略格式:
數據類型[] 數組名稱 = {元素1, 元素2, ...};

注意: 靜態初始化沒有指定長度,但仍有長度
動態初始化(基本)和靜態初始化,可以拆分成兩個步驟:定義&賦值。

三、數組的使用

  • 直接打印數組: (得到內存地址的哈希值)
    在這裏插入圖片描述
    哈希函數是一種加密方法,你可以簡單理解爲,一些數據進去,另一些數據出來
  • 使用數組元素:
    使用數組用到的是索引
    現在一家房地產開發商,叫了20箇中老年人去排隊,給每個人一個號牌。第一個人的號牌是0,第二個人是1,以此類推。執行中老年人後來可以憑藉這些號牌領錢。7號是“張三”,所以當叫“7號”時,張三就會過去領錢。張三就是數據,號牌就是索引。
    所以,我們可以知道索引是從0開始的。

1. 使用索引取靜態初始化的數組

array1[0];  // 取出數組0號元素

在這裏插入圖片描述

2. 使用索引取動態初始化的數組

在這裏插入圖片描述
可以發現,是空值

  • 使用動態初始化數組,會有一個默認值:
    如果是整數,默認爲0
    如果是浮點,默認爲0.0
    如果是字符,默認爲 '\u0000’
    如果是布爾,默認爲false
    如果是引用,默認爲null

靜態初始化也有默認值的過程,只不過系統自動給其賦值大括號內的元素。

3. 給數組賦值

array[0] =;  // 給數組的這個索引賦值

在這裏插入圖片描述

四、java虛擬機中的內存

1. java虛擬機中的內存劃分

Java中內存劃分爲5個部分:

  1. 棧內存(Stack):存放方法中的局部變量(方法的參數或方法內部的變量),這些變量一旦超出作用域,立即從棧內存中消失。
  2. 堆內存(Heap):凡是new過的,都在堆中。
    堆內存裏的東西,都有一個地址值(16進制)
    堆內存裏的數據,都有默認值。規則,如三、2.裏面所示
  3. 方法區(Methon Area):存儲.class相關信息,包含方法的信息(死信息,真正方法的運行在棧內存中)。

  1. 本地方法棧(Native Methon Stack):與操作系統相關。
  2. 寄存器(pc Register):與CPU相關。

以上所有,特別是四和五,可以看看《程序是怎樣跑起來的》這本入門讀物(兩天可以讀完),應該在第一章。這部分內容,我之後也會嘗試寫成段子供大家閱讀。

2. 當我操作數組時,我到底在操作什麼

下面我們來看一下,這一段代碼發生了什麼
在這裏插入圖片描述

  • 這個內存是我隨便畫的,僅僅作爲示例在這裏插入圖片描述
  1. 方法區載入main()方法。在運行時,把方法信息加載到棧中(進棧),爲棧方法開闢一個內存空間。
    在這裏插入圖片描述
  2. 數組名就是一個局部變量,進棧。new方法在堆中開闢一個內存空間。
    在這裏插入圖片描述
  3. 數組有一個自己的地址值。 棧中把這個地址值存儲下來。有了地址,就可以找到這個數組的位置。所以數組變量並不是等於這個真正的數組,而是建立了對其的引用。所以數組是引用類型。
    在這裏插入圖片描述
  4. 打印數組
    在這裏插入圖片描述
  5. 打印元素
    在這裏插入圖片描述
  6. 給元素賦值
    在這裏插入圖片描述

3. 引用的概念

有這樣一個數組,叫arrayA,從上面我們知道,arrayA裏面存放着一個地址值。如果我們再創建一個數組:

int[] arrayB = arrayA

其實只是arrayA的地址值賦給了arrayB。兩個數組的地址值,指向同一個數組。這個arrayA和arrayB,都是對這個數組的引用。所以叫引用類型。指向堆的這個,叫做指針。


引用: 總而言之,一個變量存的不是數據本身,而是數據所在位置,就叫引用。這個指向叫做指針。

// 非引用
int a = 1;  // 這是一個非引用,這種賦值叫 “複製”
int b = a;  // 這句話的意思是,把a的值複製一份,給b
// 這兩句代碼執行後,真正的“數據值 1”,會有兩個

// 引用
int[] arrayA = {1, 2};  // 數組是存在堆中的,arrayA只是擁有這個地址
int[] arrayB = arrayA;  // arrayB複製了arrayA所記錄的地址
// 這兩句代碼執行後,真正的“數組” ,只會有一個

4. 空指針異常

定義數組,不創建(賦予地址值)是不行的。

int[] array = null;  // 所有引用類型,都可以賦值爲nall
System.out.println(array[0])  // 報錯:空指針異常

五、數組常用操作

1. 獲取數組長度

數組名.length;  // 返回一個int

在這裏插入圖片描述

2. 遍歷

什麼叫遍歷呢,古有云“遍歷人間春色”
遍歷 就是把數組內的所有元素,挨個按同樣方法操作一遍。最常見的操作是打印。

  • 我們使用for循環遍歷一下:
for (int i = 0; i < array.length; i++){
	System.out.println(array[i])
}

快捷鍵是數組名稱.fori加上回車
在這裏插入圖片描述

Demo:求出數組最大值

在這裏插入圖片描述

Demo:反轉一個數組

  • 方法1 ,創建一個新數組做中間數組。(這種方法比較佔空間)
    在這裏插入圖片描述
  • 方法2 ,創建一個變量,做中間變量
    在這裏插入圖片描述

3. 數組作爲參數

  • 數組可以作爲參數傳遞。傳遞的是地址值

在這裏插入圖片描述

4. 數組作爲返回值

數組作爲返回值,返回的也是地址值。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章