美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

时间:2022-10-01 19:18:08

本文首发于微信公众号:程序员乔戈里

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是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。

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

小萌边说边在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的代码单元的数目。

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

代码单元指一种转换格式(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!

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

来看个例子!

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