Unicode构造器字符串生成不一致及运行时过慢问题咨询
问题解答
一、特殊字符处理异常的原因及String构造器说明
问题根源
你的代码错误地将char索引当成了Unicode代码点索引来获取字符:
- Java的
String内部采用UTF-16编码存储,一个完整的Unicode字符(代码点)可能占用1个或2个char(后者称为「代理对」,范围是U+D800~U+DFFF)。 input.length()返回的是char的数量,而非实际Unicode字符的数量;codePointAt(i)的参数i是char数组的索引,不是代码点的索引。
以你提供的示例输入为例:
第一个字符🃎(U+1F0CE)是代理对字符,占用2个char:U+D83C(56526)和U+DCCE(56526)。你的循环中i=1时,codePointAt(1)取到的是该字符的第二个char(低代理码元),而非第二个完整的Unicode字符🂸的代码点。这些孤立的代理码元本身不是有效的Unicode字符,用它们构造String就会出现乱码(如、)。
String构造器的编码支持
new String(int[] codepoints, int offset, int length)构造器完全支持所有Unicode代码点,和UTF-8无关,它的作用是将传入的Unicode代码点数组,正确转换为UTF-16编码的String存储形式。问题不在构造器,而在你获取代码点的逻辑错误。
二、修改后代码性能变慢的可能原因
你的代码修改本身逻辑上不会导致性能问题,但以下几种情况可能引发慢执行:
- 循环条件被错误修改
如果实际代码中把循环条件从i < arr.length改成了i < input.length(),那么当输入字符串的char数量极大(比如百万级)时,循环会执行百万次,而非最多5次,直接导致性能暴跌。 - 高频调用下的小对象分配
如果这个方法被极端高频调用(比如每秒数百万次),每次根据短字符串创建长度为1~4的数组,会产生大量小对象,增加JVM垃圾回收的压力,间接导致整体性能下降。 - 对
input.length()的误解导致逻辑冗余
如果你误将input.length()当成了Unicode字符数量,当输入全是代理对字符时,可能会出现逻辑上的循环冗余,但这种情况不会直接引发明显的性能问题,更多是逻辑错误。
内容的提问来源于stack exchange,提问作者stanleysearles
相关产品推荐
相关产品推荐

