使用String.length()和string.toCharArray()进行速度/效率权衡。长度

时间:2014-03-26 16:45:33

标签: java arrays string performance char

我有一个接受String参数的方法。我需要将String转换为char[]进行处理。但是,如果我的String大于某个长度,我可以停止处理我的方法逻辑。

public void doSomething(String str) {
  char[] strArray = str.toCharArray();
  // do something
}

我知道在空间效率方面,我应该在创建str.length()之前检查char[]。但是,这让我思考。就时间复杂度而言,假设我还需要char[],这会更有效率吗?

假设我已经拥有两个Stringchar[]对象,哪个更快/更有效?

  1. str.length()

  2. strArray.length

2 个答案:

答案 0 :(得分:10)

由于你已经有了两个对象,时间复杂度是相同的:它是O(1),因为java.lang.String和Java数组都存储它们的长度以供直接检索。

但是,您可以使用字符串的getChars method来改进方法的时间,以避免将字符复制到所需子字符串的末尾:

int maxLength = 100;
int effectiveLength = Math.min(maxLength, str.length());
char[] strArray = new char[effectiveLength];
str.getChars(0, effectiveLength, strArray, 0);

如果您的算法在到达字符串末尾之前可以停止处理,这种方法可以避免分配额外的内存并将字符复制到其中。

答案 1 :(得分:4)

这取决于方法的实现方式,Java API也不保证。

当前的实现是toCharArray()将为您提供String的底层缓冲区的副本,因此它是一项非常昂贵的操作(内存分配+复制许多字节),特别是与{ {1}}只返回内部str.length()字段的值(至少在Java 6中)。

在Java 7+中,他们似乎已经停止共享底层字符数组(现在,final总是复制)。