java數組與存儲方式

本文由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的長度和引用地址都變了。

發佈了32 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章