文章目錄
一、數組的含義
數組: 是一種容器,可以同時存放多個數據值
特點
- 是引用數據類型
- 數組中的數據,類型必須統一
- 數組的長度在程序運行期間不可改變
可以這樣想,數組就是一個冰箱(冰箱不屬於四類八種,所以是引用數據類型),裏面只能放食物(類型統一),容積一定(長度不可變)
二、數組的定義
數組有兩種常見的初始化方法:
- 動態初始化(指定長度)
- 靜態初始化(指定內容)
1. 動態初始化
數據類型[] 數組名稱 = new 數據類型[數組長度];
- 數據類型(左),指定保存的數據的類型
[]
,代表是一個數組(區別於,定義變量之類)- new 代表創建數組的動作
- 數據類型(右),要和左邊保持一致
- 數組長度是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個部分:
- 棧內存(Stack):存放方法中的局部變量(方法的參數或方法內部的變量),這些變量一旦超出作用域,立即從棧內存中消失。
- 堆內存(Heap):凡是new過的,都在堆中。
堆內存裏的東西,都有一個地址值(16進制)
堆內存裏的數據,都有默認值。規則,如三、2.
裏面所示 - 方法區(Methon Area):存儲
.class
相關信息,包含方法的信息(死信息,真正方法的運行在棧內存中)。
- 本地方法棧(Native Methon Stack):與操作系統相關。
- 寄存器(pc Register):與CPU相關。
以上所有,特別是四和五,可以看看《程序是怎樣跑起來的》這本入門讀物(兩天可以讀完),應該在第一章。這部分內容,我之後也會嘗試寫成段子供大家閱讀。
2. 當我操作數組時,我到底在操作什麼
下面我們來看一下,這一段代碼發生了什麼
- 這個內存是我隨便畫的,僅僅作爲示例
- 方法區載入main()方法。在運行時,把方法信息加載到棧中(進棧),爲棧方法開闢一個內存空間。
- 數組名就是一個局部變量,進棧。new方法在堆中開闢一個內存空間。
- 數組有一個自己的地址值。 棧中把這個地址值存儲下來。有了地址,就可以找到這個數組的位置。所以數組變量並不是等於這個真正的數組,而是建立了對其的引用。所以數組是引用類型。
- 打印數組
- 打印元素
- 給元素賦值
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. 數組作爲返回值
數組作爲返回值,返回的也是地址值。