1. 程式人生 > >美團面試官問我一個字元的String.length()是多少,我說是1,面試官說你回去好好學一下吧

美團面試官問我一個字元的String.length()是多少,我說是1,面試官說你回去好好學一下吧

本文首發於微信公眾號:程式設計師喬戈裡






public class testT {
    public static void main(String [] args){
        String A = "hi你是喬戈裡";
        System.out.println(A.length());
    }
}

以上結果輸出為7。




小萌邊說邊在IDEA中的win環境下選中String.length()函式,使用ctrl+B快捷鍵進入到String.length()的定義。

    /**
     * Returns the length of this string.
     * The length is equal to the number of <a href="Character.html#unicode">Unicode
     * code units</a> in the string.
     *
     * @return  the length of the sequence of characters represented by this
     *          object.
     */
    public int length() {
        return value.length;
    }

接著使用google翻譯對這段英文進行了翻譯,得到了大體意思:返回字串的長度,這一長度等於字串中的 Unicode 程式碼單元的數目。

小萌:喬戈裡,那這又是啥意思呢?
喬哥:前幾天我寫的一篇文章:面試官問你編碼相關的面試題,把這篇甩給他就完事!裡面對於Java的字元使用的編碼有介紹:

Java中 有內碼和外碼這一區分簡單來說

  • 內碼:char或String在記憶體裡使用的編碼方式。
  • 外碼:除了內碼都可以認為是“外碼”。(包括class檔案的編碼)

而java內碼:unicode(utf-16)中使用的是utf-16.
所以上面的那句話再進一步解釋就是:返回字串的長度,這一長度等於字串中的UTF-16的程式碼單元的數目。


程式碼單元指一種轉換格式(UTF)中最小的一個分隔,稱為一個程式碼單元(Code Unit),因此,一種轉換格式只會包含整數個單元。UTF-X 中的數字 X 就是各自程式碼單元的位數。

UTF-16 的 16 指的就是最小為 16 位一個單元,也即兩位元組為一個單元,UTF-16 可以包含一個單元和兩個單元,對應即是兩個位元組和四個位元組。我們操作 UTF-16 時就是以它的一個單元為基本單位的。

你還記得你前幾天被面試官說菜的時候學到的Unicode知識嗎,在面試官讓我講講Unicode,我講了3秒說沒了,面試官說你可真菜這裡面提到,UTF-16編碼一個字元對於U+0000-U+FFFF範圍內的字符采用2位元組進行編碼,而對於字元的碼點大於U+FFFF的字符采用四位元組進行編碼,前者是兩位元組也就是一個程式碼單元,後者一個字元是四位元組也就是兩個程式碼單元!

而上面我的例子中的那個字元的Unicode值就是“U+1D11E”,這個Unicode的值明顯大於U+FFFF,所以對於這個字元UTF-16需要使用四個位元組進行編碼,也就是使用兩個程式碼單元!

所以你才看到我的上面那個示例結果表示一個字元的String.length()長度是2!




來看個例子!

public class testStringLength {
    public static void main(String [] args){
        String B = "