限時 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 = {0, 1, 2, 3};
但無論用哪一種方法,數組的長度是能夠明確知道的。而且不會再變長或者變短(學不了孫悟空的金箍棒)。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.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()
,他們之間的區別我相信你們已經搞清楚了。
最後提醒一點:萬丈高樓平地起。一棟樓能蓋多高,一座大橋能造多長,重要的是它們的地基。一樣對於咱們技術人員來講,基礎知識越紮實,走得就會越遠。
好了各位讀者朋友們,以上就是本文的所有內容了。能看到這裏的都是最優秀的程序員,二哥必需要伸出可愛的大拇指爲你點個贊👍。若是以爲不過癮,還想看到更多,我再推薦幾篇給你們。
靈魂拷問:Java 的 substring() 是如何工做的?
養成好習慣!若是是二哥的鐵桿讀者的話,請不要吝嗇你的鼠標左鍵,點贊就對了,來年升職加薪就是你的了!若是想第一時間看到二哥的原創文章,掃下面這個碼就對了。