String.length()和String.getBytes().length的区别

41
我是初学者并正在自学Java编程。 因此,我想了解Java中String.length()String.getBytes().length之间的区别。
哪种方法更适合检查字符串的长度?

你的实验结果表明了什么? - Andrew Thompson
你尝试过在Unicode字符串上使用它吗? - Patashu
3
string.length 返回字符串中字符的数量,而 string.getBytes().length 返回字符串在存储其值时所使用的字节数。通常情况下,每个字符需要占用 2 个字节来存储 Unicode 值。 - Arun P Johny
1
@ArunPJohny:不,string.length将返回字符串中“Unicode代码单元”的数量。对于ASCII文本,它将计算字符。对于任意Unicode文本,情况会变得有些复杂。请参见BeeOnRope的答案,了解丑陋的细节。 - sleske
4个回答

49

String.length()

String.length()是表示该字符串所需的16位UTF-16码单元的数量。也就是说,它是用于表示字符串的char值的数量,因此也等于toCharArray().length。对于大多数西方语言中使用的字符,这通常与字符串中的unicode字符(代码点)数量相同,但如果使用任何UTF-16 surrogate pairs,则代码点的数量将少于代码单元的数量。这些成对字符仅用于编码BMP之外的字符,在大多数书写中rarely used(表情符号是一个常见exception)。

String.getBytes().length

String.getBytes().length 是用于表示字符串在平台默认编码下所需的字节数。例如,如果默认编码是UTF-16(罕见),则它将恰好是String.length()返回值的两倍(因为每个16位代码单元需要2个字节来表示)。通常情况下,您的平台编码将是像UTF-8这样的多字节编码。

这意味着这两个长度之间的关系更加复杂。对于ASCII字符串,这两个调用几乎总会产生相同的结果(除了不将ASCII子集编码为1个字节的不寻常默认编码之外)。对于非ASCII字符串,String.getBytes().length可能会更长,因为它计算表示字符串所需的字节数,而length()计算2字节代码单元。

哪一个更适合?

通常,您将与其他字符串方法一起使用String.length(),这些方法采用字符串中的偏移量。例如,要获取最后一个字符,您将使用str.charAt(str.length()-1)。只有在某种原因下您正在处理由getBytes返回的字节数组编码时,才会使用getBytes().length


9

length()方法返回字符串中字符的长度。

一个字符可能会占用多个字节。表达式String.getBytes().length以平台默认的字符集返回字符串的字节长度。


1
没有名为 getLength() 的方法,我想你是指 String.getBytes().length - Bu Saeed

2
简而言之,String.length() 返回字符串中字符的数量,而 String.getBytes().length 返回用指定编码表示字符串中字符所需的字节数。
在许多情况下,String.length() 的值与 String.getBytes().length 相同。但在像 UTF-8 编码和字符值超过 127 的情况下,String.length() 的值将不同于 String.getBytes().length。 这里有一个示例,解释了在调用 String.getBytes() 时如何将字符串中的字符转换为字节。这应该让你了解 String.length()String.getBytes().length 之间的区别。

2

String.length()方法返回字符串中符号的数量。而String.getBytes().length()则返回用于存储这些符号的字节数量。 通常,字符以UTF-16编码存储。因此,每个字符需要2个字节来存储。 请参考SO answer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接