Scanner和BufferReader的效率问题
先给出一道题,测试平台是Acwing, 这道题是腾讯2019年春招提前批笔试第二题。题目不难,但是如果不注意细节,很容易TLE(超时)
https://www.acwing.com/problem/content/570/
下面的做法是用JAVA scanner依次读入输入数据,但这样做的效率较低,会直接导致TLE:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i = 1; i <= n; i++){
int l = in.nextInt();
int r = in.nextInt();
int sum1 = 0;
int sum2 = 0;
if(r%2 == 0)
sum1 = r/2;
else
sum1 = r/2-r;
if((l-1)%2==0)
sum2 = l/2;
else
sum2 = l/2-l;
System.out.println(sum1-sum2);
}
}
}
结果如下所示,在读入超过10万行的输入的时候直接超时

好的做法是使用BufferedReader来读输入,以下代码AC
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int q = Integer.valueOf(br.readLine());
while (q-- > 0) {
String[] parts = br.readLine().split(" ");
int l = Integer.valueOf(parts[0]);
int r = Integer.valueOf(parts[1]); int k = (r-l+1)/2;
int res = 0;
if(l%2==0)
res = -k;
else
res = k;
if((r-l+1)%2==1){
if(r%2==0)
res += r;
else
res -=r;
}
System.out.println(res);
}
}
}
代码通过:

可能有人觉得Scanner我也可以使用整行读入的方式呀,可是这样仍然会TLE:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//Scanner读入一个int后, 读入指针仍然停留在该行
in.nextLine();//必须消耗掉上一行的所有数据,读到\n,才能去读下一行,因此这里用nextLine()消耗掉上一行的末尾
for(int i = 1; i <= n; i++){
String[] parts = in.nextLine().split(" ");
int l = Integer.valueOf(parts[0]);
int r = Integer.valueOf(parts[1]);
int k = (r-l+1)/2;
int res = 0;
if(l%2==0)
res = -k;
else
res = k;
if((r-l+1)%2==1){
if(r%2==0)
res += r;
else
res -=r;
}
System.out.println(res);
}
}
}
说明Scanner在读入大量数据的时候确实不如BufferedReader的效率高!
有人作了测试:
从测试结果来看,Scanner的平均耗时是BufferedReader的10倍左右.

在这里贴上关于Scanner和BufferedReader的对比分析。
BufferedReader可以用来读取文件或者接收来自键盘(控制台)的信息。它比Scanner更加快捷,能够大幅度缩短程序运行时间。它下面的readline()方法可以一次性读取一行文字(String),非常方便。需要注意的是,使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。以及,在使用完BufferredReader以后,需要用close()方法关闭流。
可以从源码上看看这两者之间的区别
【Java8源码分析】IO包-Reader、BufferedReader和Scanner总结
这里面有点类似与,C++提供的cin输入流的效率远不如C的scanf函数效率高
Scanner和BufferReader的效率问题的更多相关文章
- Scanner和BufferReader之区别
在Java SE6中我们可知道一个非常方便的输入数据的类Scanner,位于java.util包中,这个Scanner的具体用法为Scanner in = new Scanner(System.in) ...
- Java输入流之BufferReader和Scanner的用法!
在Java中,我们都知道Java的标准输入串是System.in.但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等.而System.in提供的read方法 ...
- Java中Scanner类和BufferReader类之间的区别
java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...
- 转:Java中Scanner类和BufferReader类之间的区别
原文地址:https://blog.csdn.net/u014717036/article/details/52227782 java.util.Scanner类是一个简单的文本扫描类,它可以解析基本 ...
- BufferedReader与Scanner的区别
在Java中,我们都知道Java的标准输入串是System.in.但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等.而System.in提供的read方法 ...
- java中输入方式Scanner和BufferedReader
Scanner 在java.util包中,需要引入时可以用import java.util.*;或者import java.util.Scanner; 工作原理:通过new创建一个Scanner对象, ...
- 【CodeChef】Enormous Input Test
The purpose of this problem is to verify whether the method you are using to read input data is suff ...
- Java控制台读写
Java控制台读写 控制台读 Java中进行控制台读操作主要是通过Scanner,BufferReader,Console类进行 1. Scanner Scanner对象定义 在控制台 Scanner ...
- Java第8次实验(IO流)
参考资料 本次作业参考文件 正则表达式参考资料 第1次实验 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 参考文件:基础代码目录Student.jav ...
随机推荐
- 有关mysql实现oracle分析函数功能的方法
目前公司erp开发有一个脚本需求:对于收款合同审批单和收款合同(n:1),需要获取收款审批单中最新的一条审批记录来更新其对应的收款合同的相关信息. 难点主要在对相同类别的属性进行分组然后组内排序(分组 ...
- 从淘宝和网易的font-size思考移动端怎样使用rem?
最近翻了一下关于移动端的rem的使用,怎样最方便.在读到流云诸葛的一篇关于<从网易与淘宝的font-size思考前端设计稿与工作流>的文章后,来总结一下. 然而根据我以往做移动端web项目 ...
- SAP MM 实施项目里Open PO 迁移思路探讨
SAP MM 实施项目里Open PO 迁移思路探讨 .序言. SAP项目上线前夕,除了静态主数据需要导入以外,可能还有一些动态数据,比如open的采购订单,open的销售订单等单据也要迁移到SA ...
- 广州.NET微软技术俱乐部 微信群有用信息集锦
考虑到广州.NET微软技术俱乐部 微信群 十分活跃. 有用信息很有可能被淹没. 所以建立此贴. 首先群的活跃是十分重要的. 所以我是不可能把群搞得像技术论坛和github一样, 因为微信群的定位我在& ...
- iOS----------随机色
#define KColorRandomColor [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 ...
- pthread_once()函数详解
转自:pthread_once()函数详解 pthread_once()函数详解 在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库 ...
- spring学习总结——高级装配学习一(profile与@Conditional)
前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...
- 注册Github过程
第一步当然是建立自己的账号密码了: 一: github官网地址:https://github.com/ (1)第一步:首先起一个属于自己用户的名字(username),用户名字只能包含字母数字的字符或 ...
- power-virus
http://0cx.cc/category/yunwei/ 介绍安全姿势 https://www.freebuf.com/articles/system/193557.html
- Powershell-获取命令和帮助
Get-Help 获取命令的帮助文档 Update -Help 更新帮助文档 Save-Help 保存文档 Get-Help Get-VM 加上-Full参数获取详细说明 [-name] <st ...