來自:Hollis(微訊號:hollischuang)
全文字數: 1200
閱讀時間: 3分鐘
在開始正文之前,請你快速回答如下問題:
在不使用任何帶有自動補全功能IDE的情況下,如何獲取一個陣列的長度?以及,如何獲取一個字串的長度?
這個問題我問過不同水平的程式員,包括初級和中級水平的。他們都不能準確而自信地回答這個問題(如果你能很準確很自信的回答這個問題,那麼證明針對這一知識點你比大多數中級程式員掌握的好)。由於現在很多IDE都有程式碼補全功能,這使得開發人員在很多問題上都理解的很膚淺。本文將介紹幾個關於Java陣列的關鍵概念。
上面問題的正確回答姿勢應該是這樣的:
那麼問題來了,為什麼陣列有length
屬性,而字串沒有?或者,為什麼字串有length()
方法,而陣列沒有?
為什麼陣列有length屬性?
首先,陣列是一個容器物件,其中包含固定數量的同一型別的值。一旦陣列被建立,他的長度就是固定的了。陣列的長度可以作為final
實體變數的長度。因此,長度可以被視為一個陣列的屬性。
有兩種建立陣列的方法:
1、透過陣列運算式建立陣列。
2、透過初始化值建立陣列。
無論使用哪種方式,一旦陣列被建立,其大小就固定了。
使用運算式建立陣列方式如下,該方式指明瞭元素型別、陣列的維度、以及至少一個維度的陣列的長度。
int[][] arr = new int[3][];
該宣告方式是符合要求的,因為他指定了一個維度的長度(該陣列的型別為int,維度為2,第一維度的長度為3)
使用陣列初始化的方式建立陣列時需要提供所有的初始值。形式是使用{
和}
將所有初始值括在一起並用,
隔開。
int[] arr = {1,2,3};
註:
這裡可能會有一個疑問,既然陣列大小是初始化時就規定好的,那麼int[][] arr = new int[3][];
定義的陣列並沒有給出陣列的第二維的大小,那麼這個arr
的長度到底是如何“規定好”的呢?
其實,arr
的長度就是3。其實Java中所有的陣列,無論幾維,其實都是一維陣列。例如arr,分配了3個空間,每個空間存放一個一維陣列的地址,這樣就成了“二維”陣列。但是對於arr來說,他的長度就是3。
Java中為什麼沒有定義一個類似String一樣Array類
因為陣列也是物件,所以下麵的程式碼也是合法的:
Object obj = new int[10];
陣列包含所有從Object繼承下來方法,除clone()之外。為什麼沒有一個Array類呢?在Java中沒有Array.java
檔案。一個簡單的解釋是它被隱藏起來了(註:Java中的陣列有點類似於基本資料型別,是一個內建型別,並沒有實際的類與他對應)。
你可以思考這樣一個問題——如果有一個Array類,那它會像什麼樣?它會仍然需要一個陣列來存放所有的陣列元素,對嗎?因此,定義出一個Array類不是一個好的主意。(註:這裡可能有點繞,道理有點類似於:雞生蛋蛋生雞問題,可能比喻也不是很恰當,請讀者自行理解)
事實上我們可以獲得陣列的類定義,透過下麵的程式碼:
輸出:
class [I
“class [I”代表著”成員型別是int的陣列”的class物件執行時型別的簽名
為什麼String有length()方法?
String背後的資料結構是一個char陣列,所以沒有必要來定義一個不必要的屬性(因為該屬性在char數值中已經提供了)。和C不同的是,Java中char的陣列並不等於字串,雖然String的內部機制是char陣列實現的。(註:C語言中,並沒有String類,定義字串通常使用char string[6] = "hollis";
的形式)
註:要想把char[]轉成字串有以下方式:
●本文編號627,以後想閱讀這篇文章直接輸入627即可
●輸入m獲取到文章目錄
Linux學習
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。