本文由Arckal撰寫,轉載請註明出處:http://blog.csdn.net/u014108439/article/details/52966794
Java數組是一種引用數據類型。數組變量並不是數組本身,而是指向堆內存中存放的數組對象。什麼是堆內存和棧內存呢,先看一下堆和棧的區別:
棧
- 用於存儲局部變量,數據使用完(程序退出局部變量作用域後),所佔內存自動釋放。
堆
- 用於存儲數組和對象,通過new建立的實例都存放在堆內存中。
- 每個實體都有內存地址值
- 實體中變量都有默認的初始化值
- 實體不在被使用,會在不確定的時間被JVM垃圾回收
數組初始化
數組初始化分兩種
- 靜態初始化: 程序員在初始化數組時爲數組每個元素賦值;
- 動態初始化: 數組初始化時,程序員只指定數組的長度,由系統爲每個元素賦初值。
- 靜態初始化
//方法1
int a[] = {1,2,3};
//方法2
int [] a = {1,2,3};
//方法3
int [] a = new int[]{1,2,3};
以上三種方法都是建立一個數組對象,存放三個int變量,這三種方法都是等價的。
- 動態初始化
int [] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
第1句話初始化了一個數組變量a,由於初始化語句未賦值,所以被默認爲{0,0,0}
第2到第4句爲動態賦值。
數組在內存中的存儲方式
如下圖所示,int [] x = new int{1,2,3};
這句代碼聲明瞭一個int數組變量x
存儲在棧內存中,然後在堆內存建立一個int數組,包含三個值{1,2,3},然後將對這個數組的引用賦給 x
,用System.out.println(x);
打印出來就是 [I@6d06d69c
,[
代表數組,I
代表int,@
後面十六進制數字代表堆內存中數組的內存地址。
由於數組是引用數據類型,即變量 x 在棧中存儲的是堆中數組的引用。
數組變量並不是數組本身,而是指向堆內存中存放的數組對象。因此,可以改變一個數組變量所引用的數組。
int [] x = {1, 2, 3};
int [] y = x;
這裏將數組x
的引用賦給數組y
,這也是初始化的一種方式。
長度爲0的數組
還有一種方式:
int [] z = {};
大家看到這可能就不解了,這是什麼鬼?這句話其實是建立了一個長度爲0的數組,但不爲null
。這種用法一般在不知道數組長度的情況下聲明數組。使用時可以這樣擴容z = Arrays.copyOf(z, z.length+3);
,這句代碼看似將數組z的長度擴容至3,但其實這個z已不是擴容前的z了,這句代碼的實質是,在堆內存中新建了一個長度爲原數組長度加3的數組,重新賦給了z,下面貼出測試代碼:
package array;
import java.util.Arrays;
public class ArrayTest
{
public static void main(String[] args)
{
int [] y = {};
System.out.println(y);
System.out.println(y.length);
y = Arrays.copyOf(y, y.length+3);
System.out.println(y);
System.out.println(y.length);
}
}
運行結果:
[I@15db9742
0
[I@6d06d69c
3
可以看到數組z的長度和引用地址都變了。