java Scanner读取太慢而超时

简介: java Scanner读取太慢而超时

做oj的时候遇到思路和方法都正确但是不能ac,只能通过几个样例


经过一番查阅,原来是Scanner的原因,Scanner读取慢,占用内存也更多


下面介绍一下Scanner的优化方法,以及读取慢的原因


BufferedReader和BufferedWritter使用


首先定义输入输出流


 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


使用方法:


1. String[] firstline = br.readLine().split(" ");
2. String[] secondline = br.readLine().split(" ");


注意事项:


BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)(idea快捷键alt+enter抛出异常)


readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符


br.readline()是整行读取,读取的类型是字符串,我们需要对其分割,spilt(" ")意思是以每一个空格来切割并依次放到字符数组中


既然是用于读取键盘输入,那就要用到标准输入流System.in


如果要用int类型的话,要使用Integer.parseInt()进行转换


int n=Integer.parseInt(firstline[0]);


对于输出也只能输出字符串,如果需要输出一个数字,则需要+“”以转成字符串。


最后记得用完了就把cin和cout全部close掉。


bw.write(1+"");
br.close();
bw.close();


下面来看一道例题,求二进制中1的个数


https://www.acwing.com/problem/content/803/


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    final static int N=100010;
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String []s=br.readLine().split(" ");
        int n=Integer.parseInt(s[0]);
        String []s1=br.readLine().split(" ");
        int x=0;
        for (int i = 0; i < n; i++) {
            x=Integer.parseInt(s1[i]);
            int count=0;
            while (x!=0){
                x-=lowbit(x);
                count++;
            }
            System.out.print(count+" ");
        }
    }
    public static int lowbit(int x){
        return x&-x;
    }
}


接下来我们分析一下为什么Scanner比BufferReader慢很多。


Java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串,它本质上其实是使用正则表达式去读取不同的数据类型


Java.io.BufferedReader类为了能够高效的读取字符序列,从字符输入流和字符缓冲区读取文本


BufferedReader的缓冲区大小为8KB,Scanner的缓冲区大小为1KB


Scanner的平均耗时是BufferedReader的10倍左右

相关文章
|
7月前
|
存储 Java
Java Scanner类详解与应用
Java Scanner类详解与应用
271 0
【零基础学Java】—Scanner类的使用( 十)
【零基础学Java】—Scanner类的使用( 十)
JavaWeb用户信息管理系统-解决HttpSession超时销毁时的异常问题
JavaWeb用户信息管理系统-解决HttpSession超时销毁时的异常问题
69 0
|
人工智能 Java 测试技术
地址标准化通过Java sdk接入通用经纬度查询之前已经调试成功,近期一直返回超时错误
地址标准化通过Java sdk接入通用经纬度查询之前已经调试成功,近期一直返回超时错误
85 1
|
5月前
|
运维 监控 算法
java实现一个动态监控系统,监控接口请求超时的趋势
java实现一个动态监控系统,监控接口请求超时的趋势
269 2
|
26天前
|
JavaScript Java 中间件
Java CompletableFuture 异步超时实现探索
本文探讨了在JDK 8中`CompletableFuture`缺乏超时中断任务能力的问题,提出了一种异步超时实现方案,通过自定义工具类模拟JDK 9中`orTimeout`方法的功能,解决了任务超时无法精确控制的问题,适用于多线程并行执行优化场景。
|
3月前
|
Java 数据处理
Java Scanner 类详解
`Scanner` 类是 Java 中 `java.util` 包提供的强大工具,用于从多种输入源(如键盘、文件、字符串)读取数据。本文详细介绍如何创建 `Scanner` 对象并使用其常用方法(如 `next()`, `nextInt()`, `nextLine()` 等)。通过示例代码展示如何从标准输入、字符串及文件中读取数据,并进行输入验证。使用时需注意关闭 `Scanner` 以释放资源,并确保输入类型匹配,避免异常。掌握 `Scanner` 可显著提升程序的数据处理能力。
92 1
|
4月前
|
Java
Java系列之 超时任务处理方法
这篇文章介绍了Java中处理超时任务的方法,通过使用`FutureTask`和`ExecutorService`来异步执行可能耗时的任务,并设置超时时间,如果任务在指定时间内未完成,则主动结束任务并返回默认结果。
Java系列之 超时任务处理方法
|
6月前
|
小程序 Java
28. 【Java教程】Scanner 类
28. 【Java教程】Scanner 类
134 7