1

我想知道使用 .charAt() 是否比将字符串变量转换s为 char[]a数组并通过a[i]而不是访问它更慢s.charAt(i)

假设我们正在处理字符串中每个字符都有很多运算符的问题。

4

4 回答 4

7

String#charAt(int index)Oracle 的 Java 7的实现:

public char charAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}

使用检查会更安全一些,但它的行为完全相同。

它实际上会更慢返回char[]

public char[] toCharArray() {
    // Cannot use Arrays.copyOf because of class initialization order issues
    char result[] = new char[value.length];
    System.arraycopy(value, 0, result, 0, value.length);
    return result;
}

因为你必须先复制它。

于 2013-08-08T14:35:40.240 回答
1

实际上,String该类已经这样做了,因为它将其内容保存为char[].

String#charAt()返回

public char charAt(int index) {
    if ((index < 0) || (index >= count)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index + offset];
}

wherevaluechar[]保存字符串的地方,offset它允许两个或多个字符串共享相同的字符数组,就像一个字符串是另一个字符串的子字符串一样。

于 2013-08-08T14:34:57.800 回答
1

如果您看到charAt() 注释的源代码 ,您就会找到答案。

它已经从它的char array 唯一返回,所以没有办法再次比较它。

  private final char value[];

返回指定索引处的 char 值。索引的范围从 0 到 length() - 1。序列的第一个 char 值在索引 0 处,下一个在索引 1 处,依此类推,与数组索引一样。如果索引指定的 char 值是代理项,则返回代理项值。

于 2013-08-08T14:36:00.783 回答
1

无论性能如何,如果您主要将对象视为 char 数组,则将其设为 char 数组可能会更清晰。

了解重复 charAt 调用的开销是否比复制 char[] 一次的成本更重要的唯一方法是使用您的实际操作和字符串长度进行测量。

于 2013-08-08T14:36:55.403 回答