Java字符串 - 比较charAt()和索引运算符[]

时间:2013-08-08 14:32:54

标签: java string indexing character

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

假设我们正在研究字符串中每个字符上有很多运算符的问题。

4 个答案:

答案 0 :(得分:7)

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

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;
}

因为你必须先复制它。

答案 1 :(得分:1)

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

String#charAt()返回

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

其中value是持有字符串的char[],而offset是允许两个或多个字符串共享相同字符数组的东西,就像一个字符串是另一个字符串的子字符串一样。< / p>

答案 2 :(得分:1)

如果您看到Source code of charAt()条评论,就会找到答案。

它已经从char array返回,所以无法再次比较它。

  private final char value[];
  

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

答案 3 :(得分:1)

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

知道重复charAt调用的开销是否比复制char []的成本更重要的唯一方法是用你的实际操作和字符串长度来衡量。