Java中的數組
--模範青蛙
數組可以理解爲同一種類型數據的集合,說的簡單一些,他就是一個只能存放同一類型東西的容器。一維數組是多個相同數據類型的集合,二維數組是多個相同數據類型的一維數組的集合。因此操作數組的時候可以把數組中的每個元素當成普通變量進行操作。
使用數組的一個好處是:可以自動給數組中的元素從0開始編號,方便操作這些元素。
往往有利也有弊,使用數組做查詢,更改信息操作是比較快的,但是做插入,刪除操作可就太麻煩了,你需要在插入或刪除數組元素的位置之後,移動所有的剩下的元素
Java語言是典型的靜態語言,所以Java數組也是靜態的,在使用Java數組之前必須先對數組對象進行初始化,當所有的數組元素都被分配了合適的內存空間,並指定了初始值,數組的初始化纔算完成,數組一旦初始化完成後,程序將不能改變數組對象在內存中的位置和大小。
數組的初始化分爲靜態初始化和動態初始化兩種:
1>靜態初始化也有兩種初始化的方式
第一種如:int[] a={1,2,3};
第二種如:int[] a=new int[]{1,2,3};
直接向數組中添加元素,讓系統決定數組的長度
個人比較傾向於第一種方式。
前不久還有個童鞋拿了個二維數組來問我,代碼如下:
int[][] a=new int[][]{{1,2},{1,2,3}};其實這種初始化二維數組的方法也是正確的,只是很少見,屬於純屌絲的做法
2>動態初始化:程序猿指定數組的長度,系統爲數組賦初始值。
如:int a=new int[2];
那麼這個數組就只能存放兩個元素,並且系統爲他們默認賦初始值0。
注意了,我這裏定義的是int類型的數組,系統纔會爲他們賦默認值0,如果是其他類型的數組呢?
每種類型的數據都有他們的默認初始值
byte,short,int,long默認初始值都爲0
字符類型char默認初始值爲'\u0000'
boolean類型的是false;
引用類型(類,接口,數組)都是null
java的數組變量是一種引用類型的變量,並不是數組本身,他只是指向堆內存中的數組對象,因此可以改變一個數組變量所引用的數組,來造成數組長度可變的假象。
數組是一定要初始化後纔可以使用的
int[] a=new int[]{1,2,3};
int[] b;
b=a;
System.out.print(b.length);
看到這個程序的輸出結果,可能有的童鞋會問,數組b並沒有初始化,怎麼可以使用呢?
在這裏我只想說,學習數組的時候千萬不能把數組變量和數組對象搞混了。數組變量只是一個引用,而數組對象是保存在堆內存中的連續內存空間。對數組的初始化指的是在堆內存中創建對象也就是爲該數組對象分配一塊連續的內存空間。int[] b;雖然沒有初始化,但是經過b=a;後,把數組a在堆內存中的地址賦給了b,b的引用就指向了a在堆內存中的數組對象,也就是說此時的a和b共用堆內存中的同一個對象。
所有的局部變量都是放在棧內存中保存的,不管他是基本類型的變量還是引用類型的變量,都是存儲在各自的方法棧內存中的;而引用類型的變量所引用的對象則是存儲在堆內存中的。
說到這裏可能有的童鞋會有疑問?
什麼是棧內存?什麼是堆內存?他們到底是做什麼的?
想詳細瞭解這個問題請下載收看我的另一個資源《免費的》
http://download.csdn.net/detail/mo_fan_qing_wa/8990107
在Java中,堆內存中的對象是不允許被直接訪問的,爲了訪問堆內存中的對象,通常只能通過引用變量。說到這兒可能有的童鞋會問:同一個變量,我們怎麼才能知道他什麼時候指的是棧內存中變量的本身?什麼時候指的是堆內存中的對象呢?
其實這個也很容易分辨,引用變量本質上就是一個地址指針,只要我們的程序通過這個引用變量訪問屬性或者方法了,這個引用變量就會被他所引用的對象代替。
可能有人會問:Java中不是沒有指針嗎?
個人認爲,Java官方聲稱沒有指針,其實它底層的好多功能都是通過指針來實現的,拿最簡單的一個類來說吧,迭代器(Iterator)中的next()方法是怎麼實現的,這裏就是用的指針。Java只是把用指針的地方封裝成了方法,需要時我們拿來用就可以了。