1. 程式人生 > >靈魂拷問:Java如何獲取陣列和字串的長度?length還是length()?

靈魂拷問:Java如何獲取陣列和字串的長度?length還是length()?

限時 1 秒鐘給出答案,來來來,聽我口令:“Java 如何獲取陣列和字串的長度?length 還是 length()?”

在逛 programcreek 的時候,我發現了上面這個主題。說實話,我當時腦海中浮現出了這樣一副驚心動魄的畫面:

面試官老馬坐在我的對面,地中海式的髮型令我敬佩有加。儘管略顯疲憊,但他仍然自信地向我丟擲了上面這個問題。稍稍遲疑了一下,我回答說:“陣列用 length,字串用 length 跟上小括號”。老馬不愧是面試中的高手,一瞬間就從我的回答中捕獲到了不自信。我能感受得出來,因為我看到老馬的嘴角微微地動了一下,似乎想要咂咂嘴。但出於對於我的禮貌,他剋制住了。

到底該用 length 還是 length(),說真的,我當時真有點吃不準,懷念 IDE 的程式碼自動提醒功能啊!

int[] arr = new int[4];
System.out.println(arr.length);// 獲取陣列的長度

String str = "沉默王二";
System.out.println(str.length());// 獲取字串的長度

按理說,陣列和字串都是物件,訪問長度都用 length() 方法就好了。為什麼陣列偏偏劍走偏鋒用的 length 欄位呢?

首先呢,我們必須要明白:陣列是一個容器,當它被建立後,不僅元素的型別是確定的,元素的個數也是確定的。換句話說,陣列的長度是確定的,不可能再變長或者變短。因此,陣列可以使用一個欄位(length)來表示長度。

建立陣列的方法有兩種,這個應該大家都知道了。一種是通過 new 關鍵字建立指定長度後再賦值,另外一種是通過 {} 直接進行初始化。

// new
int[] arr = new int[4];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;

// {}
int [] arr1 = {0, 1, 2, 3};

但不管用哪種方法,陣列的長度是可以明確知道的。並且不會再變長或者變短(學不了孫悟空的金箍棒)。

由於陣列也是物件,所以以下程式碼是合法的。

Object arr2 = new int[4];

這就意味著陣列繼承了超類 java.lang.Object 的所有成員方法和欄位。事實上,的確如此,我們可以通過以下程式碼來獲取陣列的型別資訊 Class。

Object arr2 = new int[4];
System.out.println(arr2.getClass());

Object arr3 = new String[4];
System.out.println(arr3.getClass());

輸出的結果會是什麼呢?

class [I
class [Ljava.lang.String;

class [I 表示一個“int 型別陣列”在執行時的物件型別資訊;class [Ljava.lang.String; 表示一個“字串型別陣列”在執行時的物件型別資訊。

那為什麼陣列不單獨定義一個類來表示呢?就像字串 String 類那樣呢?

一個合理的解釋是 Java 將其隱藏了。假如真的存在一個 Array.java,我們也可以假想它真實的樣子,它必須要定義一個容器來存放陣列的元素,就像 String 類那樣。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}

但這樣做真的有必要嗎?為陣列單獨定義一個類,是不是有點畫蛇添足的意味。那既然陣列沒必要定義成一個類,也就沒有必要再定義一個 length() 方法來獲取陣列的長度了,直接用 length 這個欄位就可以了,不是嗎?

那為什麼字串 String 類會有 length() 方法呢?來看一下原始碼就明白了。

    /**
     * Returns the length of this string.
     * The length is equal to the number of Unicode
     * code units in the string.
     */
    public int length() {
        return value.length;
    }

length() 方法返回的正是字元陣列 value 的長度(length),value 本身是 private 的,因此很有必要為 String 類提供一個 public 級別的方法來供外部訪問字元的長度。

總結一下,Java 獲取陣列長度的時候用 length,獲取字串長度的時候用的是 length(),他們之間的區別我相信大家已經搞清楚了。

最後提醒一點:萬丈高樓平地起。一棟樓能蓋多高,一座大橋能造多長,重要的是它們的地基。同樣對於我們技術人員來說,基礎知識越紮實,走得就會越遠。


好了各位讀者朋友們,以上就是本文的全部內容了。能看到這裡的都是最優秀的程式設計師,二哥必須要伸出可愛的大拇指為你點個贊