在Java的单行中对多个整数使用BufferedReader而不是Scanner Class是否最优? - java

由于在从用户输入值的情况下,缓冲的读取器比扫描器类要快得多,但是,如在大多数算法竞赛中或在采访中观察到的那样,单个输入行上通常会有多个整数。因此,使用Scanner Class变得更加容易-

    Scanner in=new Scanner(System.in);
    int a=in.nextInt();
    int b=in.nextInt();

如果是Buffered Reader,则必须首先输入一行(因为没有readInt选项),然后根据其上的整数数目来解析该行-

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int a,b;
    String line = br.readLine(); 
    String[] strs = line.trim().split("\\s+");
    a=Integer.parseInt(strs[0]);
    b=Integer.parseInt(strs[1]);

尽管在后一种情况下输入可能会更快,但是解析是否不会花费大量时间将获得的字符串划分为单个整数?
因此,在这种情况下,上述哪一种是最佳或更快速的?

谢谢。

参考方案

非常错误的方法:您在谈论用户输入。您如何处理按人类时间尺度提供的内容绝对不重要。

人类以“秒”为单位进行操作,在某些情况下以“毫秒”为单位进行操作。

而就性能而言,扫描仪和BufferedReader之间的差异可能在微秒范围内,甚至可能在纳秒范围内。

即使我们不谈论人类在控制台上键入内容(但使用管道,例如cat somefile | java Whatever),您仍然会发生大规模的IO。您的应用程序将花费99.99%的时间等待IO发生。最终如何处理传入的字符串完全无关紧要。

换句话说:您最好将时间花在编写简洁的代码上,从而以一种易于理解的直观方式直接完成工作。然后让JIT发挥作用。

由于问题专门与处理“基于文件”的输入有关,请自行分析。我在这里会做什么:

创建一个抽象层,使我可以轻松地在不同的实现之间切换
然后我将开始对不同的解决方案进行基准测试(请仔细阅读this以准备此类活动)

您会看到,最后两段代码都会做非常相似的事情。扫描器仍在处理某些问题,您必须花相当长的时间来探究相应的源代码,才能了解扫描器解析与BufferedReader阅读+手动解析之间的潜在差异。

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…