Java中字符串长度方法length()和codePointCount()区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014166319/article/details/71308112

在String类和继承抽象类AbstractStringBuilder的StringBuilder和StringBuffer类中,length()和codePointCount()方法都是计算字符串长度。

测试运行的长度值是相等的,那为什么要设定两个方法呢?

经过研究发现:对于普通字符串,这两种方法得到的值是一样的,但对于UniCode编码来说,还是有一点区别。

实际情况是length()方法返回的是使用的是UTF-16编码的字符代码单元数量,不一定是实际上我们认为的字符个数。同理codePointCount()方法返回的是代码点个人数,是实际上的字符个数。

因为常用的uniCode字符使用一个代码单元就可以表示,但有些辅助字符需要一对代码单元表示。length()方法计算的是代码单元的数量,codePointCount()方法计算的是代码点数。

比如整数集合的数学符号”Z”(没办法打出来),它的代码点是U+1D56B,但它的代理单元是U+D835和U+DD6B,如果令字符串str = “/u1D56B”,机器识别的不是”Z”,而是一个代码点”/u1D56“和字符”B“,所以会得到它的代码点数是2,代码单元数也是2。

但如果令字符str = “/uD835/uDD6B”,那么机器会识别它是2个代码单元代理的1个代码点”Z“,故而,length的结果是代码单元数量2,而codePointCount()的结果是代码点数量1.

但平常我们使用时,这两种求字符串长度的方法还是通用的,不用加以区别。不过建议多用codePointCount()方法。

另外代码点与代码单元,见另一篇博客。

猜你喜欢

转载自blog.csdn.net/u014166319/article/details/71308112