假设我们有一个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()方法时?
答案 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。