打印多个字符与打印一个字符串

时间:2018-11-16 02:58:13

标签: java

我目前正在使用此代码以二维数组的形式打印所有字符,总共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函数吗?我想编辑一个变量可能比打印快得多。

3 个答案:

答案 0 :(得分:0)

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

首先,我们将打印字符矩阵(或您所说的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次)来获得一个大概的想法,使用这种幼稚的方法就可以正常工作。 >

答案 1 :(得分:0)

  

如果我将所有字符添加到字符串变量中,它将运行得更快吗?   只会有一个println函数吗?

答案为是,它将运行得更快。
但是请不要使用String,而应使用StringBuilder,因为如果使用String,它将在String constant pool中创建10,000个文字,这将导致较高的内存利用率,并随着时间的流逝而降低程序速度。并且StringBuilder append()方法将消除此问题。

代码:-

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

System.out.println(str);          // print created String

它的运行速度比System.out.println快,因为Java IO的操作比StringBuilder Append昂贵得多。

答案 2 :(得分:-1)

我按照建议进行了速度测试。

import java.util.Scanner;

public class StringSpeedTest 
{
    public static void main(String[] args) 
    {
        long time1 = 0;
        char[][] charMap = new char[100][100];
        for(int i = 0; i < charMap.length; i++)
        {
            for(int j = 0; j < charMap.length; j++)
            {
                charMap[i][j] = '-';
            }
        }

        long startTime = System.currentTimeMillis();
        for(int k = 0; k < 100; k++)
        {       
            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("");
            }
        }
        long endTime = System.currentTimeMillis();

        time1 = endTime - startTime;

        startTime = System.currentTimeMillis();
        for(int k = 0; k < 100; k++)
        {
            String strToPrint = "";
            for(int i = 0; i < charMap.length; i++)
            {
                for(int j = 0; j < charMap[0].length; j++)
                {
                    strToPrint+=charMap[i][j];
                    strToPrint+=" ";
                }
                strToPrint+="\n";
            }
            System.out.println(strToPrint);
        }
        endTime = System.currentTimeMillis();
        System.out.println("First time: " + time1 + " ms");
        System.out.println("Second time: " + (endTime - startTime) + " ms");

        Scanner sc = new Scanner(System.in);
        sc.nextInt();
    }
}

我将代码段循环了100次,这样我可以得到一个很好的平均值。这是结果。

First time: 82110 ms
Second time: 17999 ms

因此,将字符添加到字符串中,然后打印结果大约需要单独打印字符的时间的22%。