You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:49:02