xxxString.length()和xxxString.codePoints()。count()之间有什么区别?

时间:2018-04-27 11:44:49

标签: java

假设我们有一个String str =“count”。

    String str = "count";
    long c1 = str.length();
    long c2 = str.codePoints().count();
    System.out.println(c1==c2);//true

这里c1和c2的值都相同。所以我的问题是,当我们在程序中使用length()和codePoints()。count()方法时?

2 个答案:

答案 0 :(得分:5)

以下代码可以证明这种差异:

    StringBuilder sb = new StringBuilder();
    sb.appendCodePoint(0x12345);
    String s = sb.toString();
    System.out.println(s.length());  // Prints 2
    System.out.println(s.codePoints().count());  // Prints 1

如果您的字符串可能包含大于0xFFFF的Unicode代码点,则使用s.codePoints().count()获得正确的[*]结果。

如果您的字符串仅包含基本多语言平面中的Unicoce代码点(即'\u0000''\uFFFF'之间的字符,即您最不想要的那个字符,如果您不想要的话打印象形文字或类似的东西)然后使用s.length()代替,因为它表现更好(CPU和内存使用率更低)。

脚注:
[*]通过"更正",我指的是非技术人类用户可能会认为"字符"而不是length()返回的内容,即使用UTF-16编码表示此字符串中的Unicode字符的16位Java字符的总数 - 这是普通用户可能不知道的长度的技术度量#39;关注。

答案 1 :(得分:3)

  

代码单位是编码使用的位数。所以UTF-8会使用   8和UTF-16将使用16个单位。代码点是一个字符和这个   由一个或多个代码单元表示,具体取决于编码。

     

这意味着在Java中String.length()返回代码单元的数量   一个字符串(因为它使用UTF-16)所以代理对使用两个位置。

来自quora