用arraylist配合scanner持续读取数据,通过hasnextline()和nextline()组合判断并获取输入,支持动态扩容、空行跳过及关键词退出,避免next与nextline混用导致的换行符问题。

用集合配合 Scanner 实现持续读取,核心是“边读边存、按需扩展”,而不是一次性预设长度。关键在于选对集合类型、控制读取节奏、避免缓冲区干扰。
选 ArrayList 存数据,动态扩容最自然
ArrayList 是首选,因为它的 add() 方法天然支持无限追加,不需要提前知道输入多少条。每次读到新数据就塞进去,内存自动管理。
- 不要用数组——长度固定,容易越界或浪费空间
- 避免 LinkedList——除非你要频繁在头部插入,否则随机访问和遍历慢于 ArrayList
- 如果后续要查重或快速判断存在性,可额外配一个 HashSet 同步记录已存内容
用 hasNextLine() + nextLine() 组合最稳
这是处理不确定行数输入的黄金搭配:hasNextLine() 判断流是否还有内容(不会阻塞),nextLine() 拿整行(含空格,不跳过空白)。
- 别混用 nextInt() 和 nextLine()——nextInt() 不消费换行符,下一次 nextLine() 会立刻返回空字符串
- 如果读的是纯数字但行数不定,可用 hasNextInt() 配合 nextInt(),但必须确保每行只一个数,否则会错位
- 遇到空行想跳过?读完 line 后加一句 if (line.trim().isEmpty()) continue;
加退出机制,防止死循环
没有终止条件的 while(true) 很危险。推荐三种轻量级退出方式:
- 输入特定关键词,如 "done"、"quit"、"end",用 equalsIgnoreCase 判断
- 约定首行为数量 n,读完 n 行后自动停(适合题目类场景)
- 捕获 EOF(比如 Ctrl+D 或 Ctrl+Z),此时 hasNextLine() 自动返回 false
示例:读多行字符串存入集合
(附带基础校验与资源关闭)
import java.util.*;
public class CollectInput {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<string> lines = new ArrayList();
System.out.println("请输入多行文本(输入 'over' 结束):");
while (sc.hasNextLine()) {
String line = sc.nextLine().trim();
if ("over".equalsIgnoreCase(line)) break;
if (!line.isEmpty()) {
lines.add(line);
}
}
sc.close();
System.out.println("共录入 " + lines.size() + " 条有效内容:");
for (int i = 0; i </string>











