先看代碼:
public class Main {
public static void main(String[] args){
int[] arr = new int[3]; //動(dòng)態(tài)初始化续崖,創(chuàng)建3塊連續(xù)的空間
System.out.println(arr);
}
}
首先說一下棧配阵,堆夜涕。棧最典型的特點(diǎn)就是先進(jìn)先出,在Java程序執(zhí)行的過程中端壳, .class文件首先被裝入內(nèi)存,棧儲(chǔ)存局部變量本姥,即定義在方法聲明上和方法中的變量妻枕;堆用來儲(chǔ)存new出來的數(shù)組或?qū)ο蟆4送膺€有方法區(qū)葛账、本地方法區(qū)和寄存器等柠衅。
上圖為上述代碼的內(nèi)存圖。
再看以下代碼:
public class Main {
public static void main(String[] args){
int[] arr = new int[3]; //動(dòng)態(tài)初始化籍琳,創(chuàng)建3塊連續(xù)的空間
System.out.println(arr);
arr[0] = 10;
arr[1] = 20;
System.out.println(arr[0]);
System.out.println(arr[1]);
}
}
執(zhí)行結(jié)果如下:
在這里菲宴,直接打印arr產(chǎn)生的結(jié)果 [I@4554617c 表示什么呢?
直接打印數(shù)組名趋急,結(jié)果為[I@4554617c 喝峦,其中[表示數(shù)組的維數(shù),有幾個(gè)就代表幾位數(shù)組呜达,I表示數(shù)組為int型谣蠢,@是默認(rèn)的,最后的4554617c代表數(shù)組的地址查近。
內(nèi)存圖如下:
如果定義一個(gè)arr2并讓他等于arr眉踱;那么其實(shí)這兩個(gè)數(shù)組引用指向的是同一個(gè)內(nèi)存塊,改變其中任意一個(gè)霜威,都是對(duì)內(nèi)存塊中的數(shù)據(jù)進(jìn)行操作谈喳。
下圖表示新建arr1和arr2兩個(gè)數(shù)組,然后定義arr3=arr2戈泼,并對(duì)其進(jìn)行操作:
二維數(shù)組的內(nèi)存圖如下:
此外再多說一個(gè)知識(shí)點(diǎn):基本數(shù)據(jù)類型的值傳遞婿禽,不改變?cè)担驗(yàn)檎{(diào)用后就會(huì)彈棧大猛,局部變量隨之消失扭倾;引用數(shù)據(jù)類型的值傳遞,改變?cè)低旒ǎ驗(yàn)榧词狗椒◤棗L乓迹菍?duì)內(nèi)存數(shù)組對(duì)象還在,可以通過地址繼續(xù)訪問琼牧。
Java中到底是傳值還是傳址恢筝?
java中只有傳值哀卫,因?yàn)榈刂分狄彩侵担ǔ鋈ッ嬖嚩颊f這種,支持者是高司令 (Java之父))撬槽。