技术问询:CharSequence.length()与String.length()是否始终相等?
问题解答:
x.length() == y.length() 是否始终成立? 答案是不一定,得看CharSequence的具体实现:
1. 标准库中的CharSequence实现(比如String、StringBuilder、StringBuffer)
对于Java标准库提供的这些实现,这个判断始终为真。
原因很简单:这些类的length()方法返回的是底层存储的UTF-16代码单元(也就是char值)的数量,而toString()方法会完整复制这些char序列到新的String中。哪怕是处理Unicode代理对(比如一个需要两个char表示的Emoji字符),原CharSequence的length()会把它算成2,生成的String的length()也同样是2,两者必然相等。
举个例子:
CharSequence x = "😀"; // 这个Emoji是一个Unicode代码点,对应两个char String y = x.toString(); System.out.println(x.length()); // 输出2 System.out.println(y.length()); // 输出2,两者相等
2. 自定义的CharSequence实现
如果是自己实现的CharSequence类,那就完全有可能不相等了。因为CharSequence是一个接口,它只规定了方法签名,并没有强制要求length()的返回值必须和toString()生成的String的长度一致。
比如下面这个故意搞事情的实现:
class SneakyCharSequence implements CharSequence { @Override public int length() { return 10; // 随便返回一个数 } @Override public char charAt(int index) { return 'x'; } @Override public CharSequence subSequence(int start, int end) { return this; } @Override public String toString() { return "hello"; // 这个String的length是5 } } // 测试代码 CharSequence x = new SneakyCharSequence(); String y = x.toString(); System.out.println(x.length() == y.length()); // 输出false
这种情况下,两者的长度就不相等了。
额外补充:关于Unicode代码点的误区
有些同学可能会混淆“Unicode代码点数量”和“char数量”。但要注意,CharSequence.length()和String.length()都是返回char的数量(UTF-16代码单元数),不是代码点数量。所以哪怕是多代码点的字符,只要原CharSequence的length()遵循这个规则,生成的String长度就会和它一致。
内容的提问来源于stack exchange,提问作者AlanSTACK
相关产品推荐
相关产品推荐

