Java中的length字段和length()方法
首先,你能快速回答下面的問題嗎?
如果沒有IDE(集成開發(fā)環(huán)境)的自動補全功能,如何獲取數(shù)組和字符串的長度?
我問了不同等級的開發(fā)者(初級和中級)同樣的問題,他們很難準(zhǔn)確而確信地給出答案。雖然IDE提供的代碼自動補全功能十分方便,但也帶來了“表面理解(surface understanding)”的問題。在本文中,我會解釋一些和Java數(shù)組的關(guān)鍵概念。
上述問題的答案如下:
int[] arr = new int[3]; System.out.println(arr.length);//數(shù)組的length屬性 String str = "abc"; System.out.println(str.length());//字符串的length()方法 |
現(xiàn)在的問題是,為什么數(shù)組有l(wèi)ength屬性而字符串沒有?或者,為什么字符串有l(wèi)ength()方法而數(shù)組沒有?
問題1. 為什么數(shù)組有l(wèi)ength屬性?
首先,數(shù)組是一個容器對象,它保存了一定數(shù)量的某一類型的值。當(dāng)一個數(shù)組被創(chuàng)建出來后,它的長度就不會再改變了。數(shù)組的長度可視作一個final實例變量。因此,長度可被認(rèn)為是數(shù)組定義的一個屬性。
創(chuàng)建數(shù)組有兩種方式:1)數(shù)組創(chuàng)建表達(dá)式;2)數(shù)組初始化。一旦數(shù)組被創(chuàng)建,它的長度就固定了。
下面的數(shù)組聲明雖然只指明了數(shù)組中第一維的長度,但它是合法的。
int[][] arr = new int[3][]; |
數(shù)組的初始化創(chuàng)建了一個數(shù)組并為其中的每個元素賦上初始值,它是由一個被“{”和“}”包圍的用逗號分隔的若干表達(dá)式構(gòu)成,示例如下:
int[] arr = {1, 2, 3}; |
問題2. 為什么沒有一個像“String”一樣定義的“Array"類?
因為數(shù)組是一個對象,所以下面的代碼是合法的。
Object obj = new int[10]; |
數(shù)組包含了Object類中的所有成員(除了clone)。為什么不能像定義一個類那樣定義數(shù)組呢?我們找不到一個Array.java文件。一種比較簡單的解釋是:它們被掩藏了。你可考慮一下這個問題:如果有一個數(shù)組類,那么它該是什么樣的?我們還是需要一個數(shù)組來保存數(shù)組數(shù)據(jù),是不是?因此,定義一個這樣的類似很不明智的。
事實上,我們可以通過下面的方式來獲取一個數(shù)組類:
int[] arr = new int[3]; System.out.println(arr.getClass()); |
輸出的結(jié)果是:
class[] |
”class[]“是”int類型數(shù)組“類對象的運行時類型簽名。
問題3. 為什么字符串有l(wèi)ength()方法?
字符串中保存字符數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是一個字符數(shù)組。因此,沒有必要定義一個在實際應(yīng)用中不必須的字段。與C語言不通,在Java中,一個字符數(shù)組并不是一個字符串。