首先竖幔,你能夠快速回答下面的問題嗎怀骤?
在不使用具有任何代碼自動補全功能的IDE的情況下,如何獲取一個數(shù)組的長度使用涡匀,又如何如何獲取字符串的長度呢?
我曾經(jīng)開門見山地向不同水平的開發(fā)者問了這個問題溉知,他們無法準確而自信地回答這個問題陨瘩。IDE在提供可靠的自動代碼補全功能的同時腊嗡,也使得我們對于知識的掌握程度停留在表面水平。在這篇文章中拾酝,我將會解釋一些關于數(shù)組的關鍵概念。
好吧卡者,上面問題的答案是:
int[] arr = new int[3];
System.out.println(arr.length);//length for array
String str = "abc";
System.out.println(str.length());//length() for string
現(xiàn)在的問題是蒿囤,為什么數(shù)組有l(wèi)ength字段而字符串沒有呢?又為什么字符串有l(wèi)ength()方法而數(shù)組沒有呢崇决?
問題1 為什么數(shù)組有l(wèi)ength屬性材诽?
首先,數(shù)組是一個保存固定大小的單一類型的對象的容器恒傻。數(shù)組一經(jīng)創(chuàng)建脸侥,其length不會改變[1]。數(shù)組的length是可以得到的作為一個final的實例變量盈厘。因此睁枕,length可以認為是數(shù)組的一個規(guī)定的屬性。數(shù)組可以通過兩種方式創(chuàng)建:1)數(shù)組聲明表達式 2)數(shù)組初始化器沸手。一旦創(chuàng)建外遇,其大小就被固定了。數(shù)組的聲明表達式已經(jīng)在上面的例子中使用了契吉,它指出了元素的類型跳仿,數(shù)組的維數(shù),以及數(shù)組至少一維的長度捐晶。下面的聲明也是合法的菲语,因為它聲明了多維數(shù)組中的一個的長度。
int[][] arr = new int[3][];
數(shù)組初始化器在聲明的同時給定了初始值惑灵,它是寫成一個用花括號包起來的逗號分隔的列表的形式山上。
舉個例子,
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ù)組這樣的一個類不是一個好主意。
事實上勾邦,我們可以通過下面的代碼得到數(shù)組的類:
int[] arr = new int[3];
System.out.println(arr.getClass());
輸出:
class [I
“class [I” 代表了“一個裝了int類型數(shù)據(jù)的數(shù)組對象”的運行時類型符號蚣录。
問題3 為什么String有l(wèi)ength()方法呢?
字符串的內(nèi)部是使用字符數(shù)組來實現(xiàn)的眷篇。不需要定義一個在任何程序中都不需要的字段萎河,與C語言不同,在Java中字符數(shù)組不是字符串蕉饼。
引用:
[1]數(shù)組
[2]JAVA語言規(guī)范 數(shù)組