foreach迴圈和記憶體中的陣列
1.首先說一下foreach迴圈:
當使用foreach來迭代訪問陣列元素時,迴圈變數book相當於一個臨時變數,系統會把陣列元素依次賦給這個變數,當時對該變數的修改,並不能改變原陣列元素的值。此處還記得Iterator來遍歷嗎,也是不能修改
eg: for(Book book: books){
book="哈哈哈";
System.out.println(book);//輸出“哈哈哈”
}
System.out.println(books[0]);//還是原來的值
記憶體中的陣列:引用變數存在於棧中,實際值存在堆中,《瘋狂講義》p91
Java中的陣列儲存兩類事物: 原始值(int,char,...),或者引用(物件指標).
當一個物件通過 new 建立,那麼將在堆記憶體中分配一段空間,並且返回其引用(指標).對於陣列,也是同樣的方式.
1. 一維陣列
- int arr[] = new int[3];
圖1
2. 二維陣列二維陣列又有什麼區別呢?實際上,在Java中只有一維陣列。二維陣列本質上也是一維陣列,只是陣列中的每一個元素都指向了另一個一維陣列而已。
- int[ ][ ] arr = new int[3][ ];
- arr[0] = new int[3];
- arr[1] = new int[5];
- arr[2] = new int[4];
圖2
同樣的原理,多維陣列也是如此.3. 陣列分配在記憶體的哪個區域?
Java中的陣列,也是物件(繼承Object),因此陣列所在的區域和物件是一樣的.
我們知道,
JVM 執行時資料區
包括 JVM棧,堆記憶體,以及其他區域. 看下面的關於物件的簡單示例,我們一起來了解陣列如何分配,以及引用儲存在哪裡.- class A {
- int x;
- int y;
- }
- ...
- public void m1() {
- int i = 0;
- m2();
- }
- public void m2() {
- A a = new A();
- }
- ...
上面的程式碼片段中,讓我們執行 m1()方法看看發生了什麼:
- 當 m1 被呼叫時,一個新的棧幀(Frame-1)被壓入JVM棧中,當然,相關的區域性變數也在 Frame-1中建立,比如 i;
- 然後 m1呼叫m2,,又有一個新的棧幀(Frame-2)被壓入到JVM棧中; m2方法在堆記憶體中建立了A類的一個物件,此物件的引用儲存在 Frame-2的區域性變數 a 中. 此時,堆記憶體和棧記憶體看起來如下所示:
圖3
相關文章
- JS陣列迴圈的效能和效率分析(for、while、forEach、map、for of)JS陣列While
- JavaScript 中 for in 迴圈和陣列的問題JavaScript陣列
- awk 陣列和迴圈陣列
- 陣列迴圈陣列
- 迴圈陣列最大子段和陣列
- linux awk 陣列和迴圈Linux陣列
- 陣列在記憶體中的變化陣列記憶體
- 陣列迴圈移位陣列
- while迴圈和do迴圈、緩衝區、一維陣列While陣列
- JavaScript的map迴圈、forEach迴圈、filter迴圈、reduce迴圈、reduceRight迴圈JavaScriptFilter
- 陣列迴圈輸出陣列
- mybatis foreach迴圈MyBatis
- java陣列記憶體的探究Java陣列記憶體
- java陣列的記憶體分析Java陣列記憶體
- 陣列常見的遍歷迴圈方法、陣列的迴圈遍歷的效率對比陣列
- ARC記憶體管理以及迴圈引用記憶體
- for..in 迴圈陣列需注意陣列
- php陣列迴圈遍歷PHP陣列
- 物件陣列的記憶體圖解物件陣列記憶體圖解
- PHP通過迴圈來檢測四維陣列中的值是否存在陣列中PHP陣列
- for迴圈訪問php的索引陣列PHP索引陣列
- Java陣列(基本+記憶體分析)Java陣列記憶體
- js陣列迴圈方法對比JS陣列
- 陣列元素迴圈右移問題陣列
- 靜態佇列,迴圈陣列實現佇列陣列
- 佇列 和 迴圈佇列佇列
- ASP.NET Razor – VB 迴圈和陣列簡介ASP.NET陣列
- Java入門學習-學習if & else,for迴圈,foreach迴圈,while迴圈的用法。JavaWhile
- MyBatis中批量插入資料,多重forEach迴圈MyBatis
- iOS 進階 - 記憶體管理(八) -- 迴圈引用iOS記憶體
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- ORM 如何不用迴圈只返回表中單列的陣列集合 - pluckORM陣列
- 陣列記憶體地址解讀及二維陣列的遍歷陣列記憶體
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- 迴圈陣列最大欄位和(51Nod-1050)陣列
- ASP.NET Razor – C# 迴圈和陣列簡介ASP.NETC#陣列
- 二維陣列的動態記憶體分配和釋放 (轉)陣列記憶體