应使用ArrayList替代数组存储通讯录,Contact类需含name、phone字段并重写toString();输入时统一用nextLine()防回车残留;文件读写分别用BufferedReader和PrintWriter(开启自动刷新);查找删除须遍历且避免边遍历边remove。

用 ArrayList 存通讯录数据,别用数组
硬编码数组长度会卡死后续增删——新增联系人时得手动扩容、删人要移动元素,容易越界或漏删。ArrayList 天然支持动态增删,且能直接用 add()、remove(int)、get(int) 操作。注意:必须自定义 Contact 类,字段至少含 name、phone(类型用 String,避免数字开头被截断),并重写 toString() 方便打印。
用 Scanner 读输入,但别漏掉 nextLine() 吃回车问题
调用 next() 或 nextInt() 后,缓冲区残留的换行符会被下一次 nextLine() 直接读成空字符串——这是新手最常遇到“输入跳过”的原因。解决方式统一用 nextLine() 读所有输入,数字字段再用 Integer.parseInt() 转换;或者在 nextInt() 后补一句 scanner.nextLine() 清掉回车。
保存到文件用 PrintWriter,读取用 BufferedReader
写入时用 PrintWriter 可直接调用 println(contact.toString()),自动换行;读取时用 BufferedReader.readLine() 逐行解析,每行按固定分隔符(如 " | ")切分字段。注意:PrintWriter 构造函数要传 true 开启自动刷新,否则内容可能滞留在缓冲区不落盘;读取时需判空行,避免 split() 出 ArrayIndexOutOfBoundsException。
try (PrintWriter pw = new PrintWriter(new FileWriter("contacts.txt", true))) {
pw.println(contact.getName() + " | " + contact.getPhone());
}
查找和删除必须遍历,别幻想集合自带“按姓名查”功能
ArrayList 没有内置索引,所有查找都得循环比对 name 字段(区分大小写?建议用 equalsIgnoreCase())。删除时别边遍历边 remove()——会跳过下一个元素。正确做法:先用 for (int i = 0; i 找到索引,再调 list.remove(i);或用迭代器 Iterator 的 remove() 方法。
立即学习“Java免费学习笔记(深入)”;
- 修改联系人:先删后加,别试图直接改对象字段再保存——文件是全量覆盖或追加,没“定位更新”机制
- 启动时加载:程序一运行就尝试读
contacts.txt,文件不存在就跳过,别让FileNotFoundException崩溃 - 中文路径/文件名:确保 IDE 和终端编码一致(UTF-8),否则读写乱码










