JAVA算法刷题---DAY 0 JAVA的快速IO
本系列可作为JAVAEE初阶学习系列的笔记文中提到的一些练习的代码小编会将代码复制下来大家复制下来就可以练习了方便大家学习。点赞关注不迷路您的点赞、关注和收藏是对小编最大的支持和鼓励系列文章目录JAVA初阶---------已更完JAVA数据结构---------已更完数据库初阶----------已更完JAVA EE初阶---------正在更新JAVA算法刷题---DAY 0 JAVA的快速IOJAVA算法刷题---DAY1 数字统计、两个数组的交集、点击消除JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离目录目录系列文章目录目录前言一、为什么普通 IO 会超时二、快速 IO 完整模板代码三、逐行代码深度解析一快速输出模块PrintWriter二快速输入模块Read 自定义类1. 成员变量2. 核心方法next ()3. 常用读取方法三主类使用规范四、快速 IO 使用示例五、核心注意事项必看六、总结总结总结前言小编作为新晋码农一枚会定期整理一些写的比较好的代码作为自己的学习笔记会试着做一下批注和补充如转载或者参考他人文献会标明出处非商用如有侵权会删改欢迎大家斧正和讨论在 Java 算法刷题过程中输入输出效率低是导致代码超时的高频原因Java 原生的Scanner输入、System.out.println输出在大数据量场景下速度极慢而自定义快速 IOFast IO能大幅提升读写效率完美解决超时问题。本文就带大家逐行解析这套通用的 Java 快速 IO 模板学会后直接复制套用再也不用担心 IO 导致的超时一、为什么普通 IO 会超时先明确核心痛点Scanner功能强大但底层实现复杂每次读取都要做大量校验大数据量下速度极慢System.out.println每调用一次就刷新一次缓冲区频繁输出会产生大量 IO 开销严重拖慢速度。而快速 IO的核心思路输入使用BufferedReader字节缓冲流一次性读取大量数据减少 IO 次数输出使用PrintWriterBufferedWriter缓冲输出最后统一刷新避免频繁 IO。二、快速 IO 完整模板代码这是算法刷题通用无侵入模板直接复制到代码中即可使用无需修改逻辑import java.util.*; import java.io.*; public class Main { // 快速输出对象全局可用缓冲输出 public static PrintWriter out new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))); // 快速输入对象全局可用封装缓冲读取 public static Read in new Read(); public static void main(String[] args) throws IOException { // ———— 此处写你的算法代码 ———— // 示例读取整数 int n in.nextInt(); // 示例输出内容 out.println(n); // 必须执行刷新缓冲区输出所有内容 out.close(); } } // 自定义快速读取类封装所有常用读取方法 class Read { // 分割字符串按空格/换行分割读取的一行数据 StringTokenizer st new StringTokenizer(); // 缓冲字符流高效读取控制台输入 BufferedReader bf new BufferedReader(new InputStreamReader(System.in)); // 读取下一个字符串按空格分割 String next() throws IOException { // 如果当前行没有可读取数据读取新一行 while(!st.hasMoreTokens()) { st new StringTokenizer(bf.readLine()); } return st.nextToken(); } // 读取一整行字符串 String nextLine() throws IOException { return bf.readLine(); } // 读取int类型整数 int nextInt() throws IOException { return Integer.parseInt(next()); } // 读取long类型长整数 long nextLong() throws IOException { return Long.parseLong(next()); } // 读取double类型浮点数 double nextDouble() throws IOException { return Double.parseDouble(next()); } }三、逐行代码深度解析我们把代码拆分为快速输出、快速输入、使用规范三部分讲解通俗易懂。一快速输出模块PrintWriterpublic static PrintWriter out new PrintWriter( new BufferedWriter( new OutputStreamWriter(System.out) ) );核心作用替代System.out.println实现缓冲输出层级解析System.out标准输出流控制台OutputStreamWriter字节流转字符流适配控制台输出BufferedWriter字符缓冲流先把数据存到内存缓冲区不立即输出PrintWriter提供print/println等易用方法简化输出关键优势数据先存在缓冲区最后调用out.close()一次性输出避免频繁 IO。二快速输入模块Read 自定义类这是模板的核心替代慢速度的Scanner我们逐方法解析1. 成员变量StringTokenizer st new StringTokenizer(); BufferedReader bf new BufferedReader(new InputStreamReader(System.in));BufferedReader bf高效缓冲输入流一次性读取一行数据速度远快于ScannerStringTokenizer st字符串分割工具默认按空格、换行、制表符分割一行字符串方便逐个读取数据。2. 核心方法next ()String next() throws IOException { // 当当前行没有可读取的token时读取新的一行 while(!st.hasMoreTokens()) { st new StringTokenizer(bf.readLine()); } // 返回下一个分割后的字符串 return st.nextToken(); }逻辑先检查当前行是否有未读取的数据没有就读取新一行再分割作用读取下一个以空格分隔的字符串是所有数值读取方法的基础。3. 常用读取方法// 读取整行 String nextLine() throws IOException { return bf.readLine(); } // 读取int int nextInt() throws IOException { return Integer.parseInt(next()); } // 读取long long nextLong() throws IOException { return Long.parseLong(next()); } // 读取double double nextDouble() throws IOException { return Double.parseDouble(next()); }所有数值类型都是基于next()读取字符串后转换为对应类型支持刷题最常用的int/long/double/String四种类型完全满足需求。三主类使用规范全局对象out和in都声明为public static整个代码中可以直接调用无需创建对象异常处理main方法必须声明throws IOException因为缓冲流会抛出 IO 异常必须收尾代码最后一定要写out.close()作用关闭输出流刷新缓冲区把缓冲区的数据全部输出到控制台不写的后果所有输出内容会留在缓冲区控制台无任何输出四、快速 IO 使用示例替换普通 IO直接套用即可public static void main(String[] args) throws IOException { // 读取整数 int a in.nextInt(); int b in.nextInt(); // 计算 int sum a b; // 输出结果 out.println(求和结果 sum); out.printf(a%d, b%d%n, a, b); // 必须关闭 out.close(); }五、核心注意事项必看禁止混用不要和Scanner、System.out.println混用会导致 IO 紊乱、输出错乱必须 closeout.close()是必写代码否则无输出异常声明所有读取 / 输出操作都会抛出IOException要么throws要么try-catch刷题直接throws最方便适用场景数据量越大比如 10 万级输入 / 输出快速 IO 的速度优势越明显。六、总结Java 算法刷题超时80% 的 IO 问题都能靠这个模板解决输入用Read类替代Scanner速度提升 10 倍以上输出用PrintWriter替代System.out大幅减少 IO 开销使用方式直接复制模板→写业务代码→最后 out.close ()零学习成本。建议把这个模板保存到你的代码片段中刷题时直接复用彻底告别 IO 超时总结超时根源Scanner和System.out在大数据量下 IO 效率极低快速 IO 核心BufferedReader缓冲输入 PrintWriter缓冲输出使用口诀全局对象直接用代码写完close流禁止混用普通 IO刷题价值通用、高效、零修改解决 Java IO 超时的最优方案。总结以上就是今天要讲的内容本文简单记录了算法刷题内容仅作为一份简单的笔记使用大家根据注释理解您的点赞关注收藏就是对小编最大的鼓励