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

Bri*_*ian 2 java arrays string performance char

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

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

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

假设我已经有两个物体Stringchar[],这是更快/更有效?

  1. str.length()

  2. strArray.length

das*_*ght 10

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

但是,您可以通过在你的方法的时机提高getChars方法的字符串,以避免复制的人物过去你所需要的子字符串的结尾:

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

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


Aar*_*lla 7

这取决于该方法的实现方式,Java API 对此不提供任何保证。

当前的实现是toCharArray()会给你一个字符串底层缓冲区的副本,所以这是一个非常昂贵的操作(内存分配+复制很多字节),特别是与str.length()只返回内部final字段的值相比(至少在Java 6中) .

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