当使用 Scanner 读取超大二维字符网格(如 10000×10000)时,原始逐字符赋值方式因 I/O 阻塞和冗余操作导致严重性能瓶颈;改用 nextLine().toCharArray() 直接转换并避免嵌套循环,可将耗时从超时降至毫秒级。
当使用 scanner 读取超大二维字符网格(如 10000×10000)时,原始逐字符赋值方式因 i/o 阻塞和冗余操作导致严重性能瓶颈;改用 `nextline().tochararray()` 直接转换并避免嵌套循环,可将耗时从超时降至毫秒级。
在处理大规模网格输入(例如岛屿计数类算法题)时,I/O 性能往往成为程序瓶颈——尤其当网格尺寸达到 10⁴ × 10⁴ 级别时。问题根源并非 Scanner 本身“慢”,而是低效的读取模式:原始代码中嵌套双层循环(外层遍历行、内层遍历列),对每行调用 String.charAt(j) 进行 10⁴ 次重复索引访问,并伴随大量边界检查与方法调用开销;同时 Scanner.nextLine() 在高吞吐场景下仍存在内部缓冲同步开销。
✅ 正确优化思路是:减少方法调用层级、避免手动字符拆解、利用字符串原生能力。关键改进点包括:
以下是优化后的生产就绪代码:
import java.io.File;import java.io.IOException;import java.util.Scanner;public static void main(String[] args) { try (Scanner input = new Scanner(new File("input.txt"))) { int rows = input.nextInt(); input.nextLine(); // consume newline after integer char[][] seaCard = new char[rows][]; for (int r = 0; r < rows; r++) { String line = input.nextLine(); seaCard[r] = line.toCharArray(); // ✅ 单次高效转换 } System.out.println("Grid loaded successfully: " + rows + "×" + seaCard[0].length); } catch (IOException e) { System.err.println("Failed to read input file: " + e.getMessage()); System.exit(1); }}
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
总结:性能问题 rarely 出自工具本身,而源于使用模式。将 O(rows × cols) 的手动字符拷贝降级为 O(rows) 的行级批量转换,配合合理的资源管理和输入源选择,即可轻松满足 8 秒时限——真正让算法逻辑而非 I/O 成为性能焦点。