我有一个接受String
参数的方法。我需要将String
转换为char[]
进行处理。但是,如果我的String大于某个长度,我可以停止处理我的方法逻辑。
public void doSomething(String str) {
char[] strArray = str.toCharArray();
// do something
}
我知道在空间效率方面,我应该在创建str.length()
之前检查char[]
。但是,这让我思考。就时间复杂度而言,假设我还需要char[]
,这会更有效率吗?
假设我已经拥有两个String
和char[]
对象,哪个更快/更有效?
str.length()
strArray.length
答案 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
总是复制)。