Java初学者项目实战:实现一个联系人管理系统

发布时间 - 2026-01-22 00:00:00    点击率:
Java初学者做联系人管理系统,核心是理清对象设计、数据存储(ArrayList)和CRUD流程;Contact类需初始化字段、重写equals/hashCode/toString;操作集合时注意引用、遍历删除、字符串比较等细节。

Java初学者做联系人管理系统,核心不是堆功能,而是理清「对象怎么建」「数据存在哪」「增删改查怎么串起来」。用 ArrayList 存联系人、用 Scanner 做简单交互、不碰数据库和图形界面,是最可控的起点。

联系人实体类怎么设计才不踩空指针和逻辑混乱

别一上来就加一堆 getter/setter 和构造方法。先想清楚:哪些字段是必须的?哪些操作会频繁用到?

  • namephone 是必填项,声明时直接初始化为 "",避免后续判空爆炸
  • 不要用 int id 自增主键——初学阶段手动维护 ID 容易错,改用 ArrayList 的索引隐式标识(比如显示时用 list.indexOf(contact) + 1
  • 重写 equals()hashCode() 很重要:否则用 remove(contact) 会删不掉,因为默认比较的是引用地址
  • toString() 一定要写,调试和打印列表时省去手动拼接
public class Contact {
    private String name = "";
    private String phone = "";

    public Contact(String name, String phone) {
        this.name = name == null ? "" : name.trim();
        this.phone = phone == null ? "" : phone.trim();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Contact contact = (Contact) o;
        return Objects.equals(name, contact.name) && Objects.equals(phone, contact.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, phone);
    }

    @Override
    public String toString() {
        return "Contact{name='" + name + "', phone='" + phone + "'}";
    }
}

用 ArrayList 管理联系人时的典型误操作

很多人写完 add() 就以为完了,结果查不到、删不掉、改无效——问题常出在「对象引用」和「集合操作时机」上。

  • 遍历中直接 remove() 会跳过下一个元素,必须用 Iterator.remove() 或倒序 for 循环
  • 修改联系人不能只改字段值:如果对象已存入 ArrayList,直接 contact.setName("new") 是生效的(因为是引用),但务必确认你操作的是集合里的那个对象,而不是 new 出来的新对象
  • 搜索联系人别用 == 比字符串,要用 .equals();更稳妥是统一转小写再比:contact.getName().toLowerCase().contains(keyword.toLowerCase())
  • 清空列表别写 contacts = new ArrayList(),这只会让变量指向新集合,原引用还在其他地方挂着;要用 contacts.c

    lear()

控制台交互容易卡死或跳过输入的坑

Scanner 读取 nextLine() 前如果刚用了 nextInt()next(),会把换行符留在缓冲区,导致下一次 nextLine() 立刻返回空字符串。

  • 统一用 nextLine() 读所有输入,数字也读成字符串再转:Integer.parseInt(scanner.nextLine().trim())
  • 每次读完做 .trim(),防止用户多敲空格导致匹配失败
  • 菜单循环里别忘了在 switch 外加 default 分支,提示 “输入无效”,否则输错就静默退出
  • 退出前加一句 System.out.println("再见!");,不然程序结束太突兀

为什么不用文件持久化,以及什么时候该加

初学阶段硬上 FileWriterObjectOutputStream,90% 的时间花在解决 FileNotFoundExceptionNotSerializableException、乱码和路径错误上,反而模糊了核心逻辑。

  • 等你能稳定完成「增删改查+搜索+按名排序」且单元测试通过后,再加文件支持
  • 第一版文件保存建议用纯文本每行一个联系人,格式如 张三,13800138000,用 String.split(",") 解析,比序列化简单得多
  • 千万别在每次增删后都全量重写文件——效率低还容易写坏。先内存操作,退出时统一保存

真正卡住初学者的,往往不是语法,而是没意识到「用户输了个空格」「两次 new 出来的对象不是同一个」「Scanner 缓冲区残留了回车」这些细节。把这些点盯住,系统就跑得稳。


# word  # java  # ai  # switch  # stream  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 长沙做网站要多少钱,长沙国安网络怎么样?  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  使用Dockerfile构建java web环境  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何选择PHP开源工具快速搭建网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何在七牛云存储上搭建网站并设置自定义域名?  音乐网站服务器如何优化API响应速度?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  简历在线制作网站免费版,如何创建个人简历?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在腾讯云免费申请建站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何正确下载安装西数主机建站助手?  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel如何处理CORS跨域请求?(配置示例)  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速完成中国万网建站详细流程?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  北京企业网站设计制作公司,北京铁路集团官方网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Android仿QQ列表左滑删除操作  JavaScript数据类型有哪些_如何准确判断一个变量的类型  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Android Socket接口实现即时通讯实例代码  移动端脚本框架Hammer.js  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  JavaScript如何实现错误处理_try...catch如何捕获异常?  深圳网站制作培训,深圳哪些招聘网站比较好?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在阿里云通过域名搭建网站?  如何在IIS中新建站点并配置端口与物理路径?  jQuery validate插件功能与用法详解  个人摄影网站制作流程,摄影爱好者都去什么网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  桂林网站制作公司有哪些,桂林马拉松怎么报名?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Linux系统命令中screen命令详解  Win11怎么设置默认图片查看器_Windows11照片应用关联设置