靈魂拷問:Java如何獲取數組和字符串的長度?length仍是length()?

限時 1 秒鐘給出答案,來來來,聽我口令:「Java 如何獲取數組和字符串的長度?length 仍是 length()?」html

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

面試官老馬坐在個人對面,地中海式的髮型令我敬佩有加。儘管略顯疲憊,但他仍然自信地向我拋出了上面這個問題。稍稍遲疑了一下,我回答說:「數組用 length,字符串用 length 跟上小括號」。老馬不愧是面試中的高手,一瞬間就從個人回答中捕獲到了不自信。我能感覺得出來,由於我看到老馬的嘴角微微地動了一下,彷佛想要咂咂嘴。但出於對於個人禮貌,他剋制住了。程序員

到底該用 length 仍是 length(),說真的,我當時真有點吃不許,懷念 IDE 的代碼自動提醒功能啊!web

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

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

按理說,數組字符串都是對象,訪問長度都用 length() 方法就行了。爲何數組恰恰劍走偏鋒用的 length 字段呢?面試

首先呢,咱們必需要明白:數組是一個容器,當它被建立後,不只元素的類型是肯定的,元素的個數也是肯定的。換句話說,數組的長度是肯定的,不可能再變長或者變短。所以,數組可使用一個字段(length)來表示長度。數組

建立數組的方法有兩種,這個應該你們都知道了。一種是經過 new 關鍵字建立指定長度後再賦值,另一種是經過 {} 直接進行初始化。ruby

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

// {}
int [] arr1 = {0123};

但無論用哪一種方法,數組的長度是能夠明確知道的。而且不會再變長或者變短(學不了孫悟空的金箍棒)。app

因爲數組也是對象,因此如下代碼是合法的。函數

Object arr2 = new int[4];

這就意味着數組繼承了超類 java.lang.Object 的全部成員方法和字段。事實上,的確如此,咱們能夠經過如下代碼來獲取數組的類型信息 Class。this

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.SerializableComparable<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(),他們之間的區別我相信你們已經搞清楚了。

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


好了各位讀者朋友們,以上就是本文的所有內容了。能看到這裏的都是最優秀的程序員,二哥必需要伸出可愛的大拇指爲你點個贊👍。若是以爲不過癮,還想看到更多,我再推薦幾篇給你們。

靈魂拷問:爲何 Java 字符串是不可變的?

靈魂拷問:建立 Java 字符串,用""仍是構造函數

靈魂拷問:如何檢查Java數組中是否包含某個值 ?

靈魂拷問:Java 的 substring() 是如何工做的?

養成好習慣!若是是二哥的鐵桿讀者的話,請不要吝嗇你的鼠標左鍵,點贊就對了,來年升職加薪就是你的了!若是想第一時間看到二哥的原創文章,掃下面這個碼就對了。

相關文章
相關標籤/搜索