從length與length()開始談Java

原文鏈接: Start from length & length() in Java


首先請看下面的問題,你能快速地回答上來嗎?

  • 假設沒有任何集成開發環境和自動補全功能,如何獲取數組的長度?如何取得字符串的長度?

我將爲  新手以及中等水平這個水平之間的開發者回答這個問題:。因爲他們中的很多人並不能正確回答出來,或者是對自己的答案缺乏信心(譯者注: 老外的初級程序員真的這樣麼).

雖然IDE提供了方便快捷的代碼補全功能,但同時也附帶了一個缺點,稱爲 表面上很瞭解(surface understandin)。

本文將解釋Java數組的一些重要概念。

上面問題的答案是:

  1. int[] arr = new int[3];  
  2. System.out.println(arr.length);//數組長度   
  3.    
  4. String str = "abc";  
  5. System.out.println(str.length());//字符串長度  
int[] arr = new int[3];
System.out.println(arr.length);//數組長度
 
String str = "abc";
System.out.println(str.length());//字符串長度
問題是爲什麼數組有length屬性域而String沒有呢?或者說爲什麼字符串對象有 length() 方法而數組沒有呢?

1. 爲什麼數組有length屬性?
首先,數組是一個容器對象,用於保存單個類型的固定數量的值。在數組創建以後,其長度是固定不變的。所以數組的length屬性可以作爲一個final域存在.

因此length可以作爲數組(array)的定義屬性(defining attribute).

數組有兩張創建方式:

1) new 數組創建表達式

2) 大括號形式的數組初始化器( array initializer)

數組在創建的時候,其大小就被指定了.

上面的例子中就使用到了數組創建表達式( array creation expression ),表達式指定了元素的類型, 數組的維度,以及最少要指定最頂層維度的大小。

下面的聲明也是合法的,因爲指明瞭數組的維度以及頂層維度的大小。

  1. int[][] arr = new int[3][];  
int[][] arr = new int[3][];
數組初始化器(array initializer) 通過指定包含的所有元素來創建一個數組,在大括號"{ }"中用分號(,)分開的表達式列表.例如:

  1. int[] arr = {1,2,3};  
int[] arr = {1,2,3};
2. 爲什麼不像String一樣定義一個"Array"類呢?
既然數組是對象,那麼下面的代碼就是合法的:

  1. Object obj = new int[10];  
Object obj = new int[10];
數組對象含有所有從Object類繼承的成員(除了 clone 方法).爲什麼沒有定義一個array的類呢? 我們也不能找到一個叫做 Array.java 的類(文件).
一個粗略的即使是這個類對開發者不可見。

可以思考這個問題? —— 如果有一個顯式的Array類,那麼它應該是什麼樣子呢? 它仍然需要一個數組來保存 數組元素,對吧?  因此定義這樣一個類是不太合理的。

實際上我們可以得到一個數組的 class(屬性),代碼如下所示:

  1. int[] arr = new int[3];  
  2. System.out.println(arr.getClass());  
int[] arr = new int[3];
System.out.println(arr.getClass());
輸出結果:

  1. class [I  
class [I
"class [I" 代表 "一個成員類型是 int 的數組"  的運行時簽名.
3. 爲什麼String有length() 方法呢?
String對象背後的數據結構是 char 字符數組, 並不需要定義一個不怎麼用到的屬性域, 和C語言不一樣,在Java中一個 char型的數組並不是String。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章