首页 > 解决方案 > 打印多个字符与打印一个字符串

问题描述

我目前正在使用此代码打印 2D 数组中的所有字符,总共 10,000 个。

char[][] charMap = new char[100][100]
for(int i = 0; i < charMap.length; i++)
{
    for(int j = 0; j < charMap[0].length; j++)
    {
        System.out.print(String.valueOf(charMap[i][j]));
        System.out.print(" ");
    }
    System.out.println("");
}

如果我将所有字符添加到一个字符串变量中,它会运行得更快吗,这样就只有一个 println 函数了?我想编辑变量可能比打印快得多。

标签: java

解决方案


由于每个人都在告诉您自己测试,因此我将尝试通过提供一些可用于测试的代码来提供帮助。

首先,我们将时间打印字符矩阵(或者您所说的 charMap)。

char[][] charMap = new char[100][100];
long startTime = System.currentTimeMillis();
for(int i = 0; i < charMap.length; i++)
{
    for(int j = 0; j < charMap[0].length; j++)
    {
        System.out.print(charMap[i][j]);
        System.out.print(" ");
    }
    System.out.println("");
}
System.out.println((System.currentTimeMillis() - startTime) + " ms");

然后,我们将使用循环构造一个字符串,然后在最后打印整个字符串。现在,我们将做同样的事情,除了为外循环的每次迭代打印一个字符串。

char[][] charMap = new char[100][100];
    long startTime = System.currentTimeMillis();
    for(int i = 0; i < charMap.length; i++)
    {
        StringBuilder sb = new StringBuilder();
        for (char c : charMap[i]) {
            sb.append(c).append(" "); //since you want the space
        }
        System.out.println(sb.toString());
    }
    System.out.println((System.currentTimeMillis() - startTime) + " ms");

自己尝试一下,看看效果如何。

注意:我知道你没有要求这个,但我也很好奇 StringBuilder 的开销。如果您不需要一行中每个元素之间的空间,您可以使用它来代替:

for(int i = 0; i < charMap.length; i++)
{
    System.out.println(charMap[i]);
}

编辑:我将自己运行其中一些测试,并且很快就会返回结果。:)

我正在像这样填充我的矩阵:

Random r = new Random();
String a = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < charMap.length; i++) 
    for (int i1 = 0; i1 < charMap[i].length; i1++) 
        charMap[i][i1] = a.charAt(r.nextInt(a.length()));

我没有对矩阵的人口进行计时。

好的,所以在第一个实现中,打印出每个索引字符后跟一个空格,我得到平均 110-140 毫秒的眼球。

使用使用 StringBuilder 的第二种方法,我得到平均 14-30 毫秒。

最后,使用省略空格的最后一种方法,我得到平均 3-9 毫秒。

注意:这不是对程序进行基准测试的最佳方法,因为 Java 会执行诸如“延迟加载”类之类的事情。您需要研究适当的基准测试技术才能真正获得性能评估。但是,我怀疑这是否重要因此使用这种幼稚的方法可以正常工作,只要您运行几次(我每个测试运行 10 次)以获得大致的想法。


推荐阅读