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