【发布时间】:2020-04-20 08:27:52
【问题描述】:
与将所有数组项追加到 StringBuffer 然后打印相比,为什么在循环中打印数组项需要更多时间?
在此,我在循环中打印了数组项。
public static void main (String[] args) {
Scanner scan=new Scanner(System.in);
int count=scan.nextInt();
for (int i=0;i<count;i++) {
int arrlen=scan.nextInt();
int rotate=scan.nextInt();
int revarr[]=new int[arrlen];
for (int j=0;j<arrlen;j++) {
revarr[(arrlen-rotate+j)%arrlen]=scan.nextInt();
}
for (int j:revarr) {
System.out.print(j+" ");
}
System.out.println();
}
}
在此,我将数组项附加到 StringBuffer 中,然后打印。
public static void main (String[] args) {
Scanner scan=new Scanner(System.in);
int count=scan.nextInt();
for (int i=0;i<count;i++) {
int arrlen=scan.nextInt();
int rotate=scan.nextInt();
int revarr[]=new int[arrlen];
for(int j=0;j<arrlen;j++){
revarr[(arrlen-rotate+j)%arrlen]=scan.nextInt();
}
StringBuffer s = new StringBuffer();
for (int j:revarr){
s.append(j+" ");
}
System.out.println(s);
}
}
【问题讨论】:
-
你的情况下这些字符串有多长?循环有多少次迭代?我们是在谈论数十次迭代还是数百万次迭代?
-
因为每个打印调用都是同步的并调用底层操作系统。 --- 仅供参考: 如果您使用
StringBuilder,您的代码会更快。 -
这是您使用输出流的次数。在 StringBuffer 的情况下,您只调用一次,但在另一种情况下,您多次调用它,并且每次都贡献一个不错的时间 linit。
-
每次都调用print,就像去逛街买5包卫生纸一样。但是你只拿一个包裹,走到收银台,付钱,把它搬到停车场。然后你往回走,再拿一个,付钱,把它移到车上,重复。相比:你拿着购物车,把5包卫生纸放进购物车,搬到收银台,一次付款,把所有东西都搬到车上。你真的很惊讶做两件完全不同的事情需要不同的时间吗?换句话说:真正的意义是在这里质疑你的假设......
-
“因为每个打印调用......都会调用底层操作系统” - 这并不完全正确。只有当
System.out的缓冲区填满或调用println时才会调用操作。
标签: java stringbuffer