
本文介绍在处理大规模输入(如含 10,000 个整数的单行文本)时,绕过字符串分割与流式解析的开销,直接使用 scanner#nextint() 进行高效批量读取的方法,显著降低 i/o 和对象创建开销。
本文介绍在处理大规模输入(如含 10,000 个整数的单行文本)时,绕过字符串分割与流式解析的开销,直接使用 scanner#nextint() 进行高效批量读取的方法,显著降低 i/o 和对象创建开销。
在 Java 竞赛或高性能输入场景中,BufferedReader + split + Stream 的写法虽简洁,但存在明显性能瓶颈:split("\s+") 会生成大量临时字符串对象;Arrays.stream() 和 mapToInt() 涉及装箱/拆箱、函数式接口调用及中间流对象构建;而 Integer::parseInt 对每个子串重复执行字符遍历与进制转换——这些操作叠加后,在 10,000 数量级下极易触发超时。
更优解是采用 预分配数组 + Scanner 直接数值扫描 方式:
import java.util.Scanner; Scanner scanner = new Scanner(System.in); int[] a = new int[10_000]; // 明确长度,避免动态扩容 int index = 0; while (index <p>该方案优势在于:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7957" title="js2java"><img src="https://img.php.cn/upload/skill/000/000/081/179178140274370.jpg" alt="js2java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill7957" title="js2java" class="overflowclass">js2java</a> <p class="overflowclass">JavaScript 到 Java 全栈翻译助手,专为前端开发者学习 Java 或快速实现后端业务逻辑而设计。当用户提到以下场景时必须使用此技能: - "帮我把这段 JS 代码转成 Java" - "用 Java 怎么写这个逻辑" - "我习惯用 JS 写,想翻译成 Java" - "教我 Java,我要写后端接...</p> </div> <a rel="nofollow" href="/xiazai/skill7957" title="js2java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- ✅ 零字符串分割:Scanner.nextInt() 在内部缓冲区中逐字符识别数字,无需生成中间 String[];
- ✅ 零流式开销:规避 Stream 创建、管道链、lambda 调用栈等运行时成本;
- ✅ 内存友好:仅需一个固定大小的 int[] 和 Scanner 的内部缓冲区(默认 1024 字节);
- ✅ 可预测性能:时间复杂度稳定为 O(n),且常数因子极小。
⚠️ 注意事项:
- 输入必须严格为纯整数序列(空格/制表符分隔),不含非法字符,否则 nextInt() 会抛出 InputMismatchException;
- 若输入规模不确定,建议先读取首行并用 scanner.hasNextInt() 循环校验,或结合 try-catch 做容错;
- 在多线程环境或标准输入被重定向的场景中,Scanner 是线程不安全的,应确保单线程使用;
- 如需极致性能(如百万级输入),可进一步切换为自定义 fast input reader(基于 BufferedInputStream 手动解析 ASCII 数字),但对 10,000 数据量而言,Scanner 已足够高效且代码简洁。
综上,当性能成为关键约束时,应优先选择面向数值的底层解析方式,而非通用字符串处理链路——这是算法竞赛和高频输入场景中的经典优化实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










