多个System.out.print()和连接的区别

12 浏览
0 Comments

多个System.out.print()和连接的区别

我想知道哪种方法更好,\n

for(int i = 0; i < 10000; i++){
    System.out.print("blah");
}
System.out.println("");

\n还是\n

String over_9000_blahs = "";
for(int i = 0; i < 10000; i++){
    over_9000_blahs += "blah";
}
System.out.println(over_9000_blahs);

\n或者是否还有更好的方法,而我不知道?

0
0 Comments

在这篇文章中,我们将讨论多个System.out.print()和字符串连接之间的区别以及出现的原因和解决方法。

根据性能的顺序,下面是不同方法的比较:

1. StringBuilder - 最快的方法。基本上,它只是将单词添加到一个字符数组中。当容量不够时,它会进行扩容。这种情况不应该超过log(10000)次。

2. System.out.print - 与StringBuilder相比,性能较差,因为我们需要10000次锁定out。此外,print每次都会创建新的char[writeBufferSize],而在StringBuilder选项中,我们只需要创建一次。

3. 字符串连接 - 创建许多(后来还可能是很大的)对象,从一定的'i'开始,内存管理会严重影响性能。

编辑:

为了更准确,因为问题是关于选项2和选项3之间的区别,而StringBuilder为什么快是非常清楚的。

我们可以说第二种方法中的每次循环都需要花费K的时间,因为代码是相同的,并且每次迭代的字符串长度都是相同的。在执行结束时,第二个选项将花费10000*K的时间进行10000次迭代。我们无法对第三种方法做出同样的说法,因为每次迭代字符串的长度都在增加。因此,分配对象和垃圾回收的时间是递增的。我的意思是,第三个选项的执行时间不是线性增加的。

所以对于较低的NumberOfIterations,我们可能看不出最后两种方法之间的区别。但是我们知道,从特定的NumberOfIterations开始,第二个选项总是比第三个选项更好。

通过使用StringBuilder而不是多个System.out.print()语句或字符串连接,可以提高性能。 StringBuilder通过将单词添加到字符数组中,避免了频繁的锁定和内存管理操作,从而提高了执行效率。

0
0 Comments

多个System.out.print()和连接的不同之处

问题的出现原因:

使用多个System.out.print()语句或字符串连接可能导致性能下降。每次迭代时,会创建一个新的StringBuilder对象,并在内部的char数组中复制字符串的字符。这意味着每次迭代都会有两次复制操作,导致时间复杂度呈平方级增长。

解决方法:

如果在循环中拼接字符串,应该使用StringBuilder。StringBuilder在内部使用一个可变的char数组来构建字符串,可以避免每次迭代都创建新的对象和复制字符的操作。以下是使用StringBuilder的示例代码:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10000; i++){
    sb.append("blah");
}
String over_9000_blahs = sb.toString();
System.out.println(over_9000_blahs);

使用StringBuilder可以有效提高性能,避免了每次迭代都创建新对象和复制字符的开销。另外,使用System.out.println()也可能会导致性能下降,因为它可能是同步的,调用它多次可能会比使用StringBuilder慢。因此,使用StringBuilder的方法应该是三者中最佳的选择。

0
0 Comments

多个System.out.print()和字符串拼接之间的区别是什么?

首先,如果只是写入System.out,第一种方法更好。但是,如果性能对你很重要,使用下面的方法更好(System.out.println是同步的,并且使用锁定 - 可以在这里和这里了解更多)。

如果您想稍后使用“big string”或提高性能,最好使用StringBuilder。无论如何,String +将由编译器转换为StringBuilder(更多细节在这里)。

以下是一个示例代码,使用StringBuilder来构建一个字符串并打印出来:

StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < 10000; i++){
    stringBuilder.append("bla");
}
System.out.println(stringBuilder.toString());

另外,关于在String上使用+=操作符,编译器会在后台将其转换为StringBuilder,但是不保证编译器会进行进一步的优化。所以,使用StringBuilder更可靠一些。

总之,使用StringBuilder可以更好地处理大量字符串的拼接,并且可以提高性能。

0