0

0

在Java里如何用List与Map实现一个联系人管理系统_Java集合操作与数据存储说明

P粉602998670

P粉602998670

发布时间:2026-02-07 14:16:03

|

123人浏览过

|

来源于php中文网

原创

ArrayList比LinkedList更适合联系人管理,因其支持O(1)随机访问,适合遍历、分页和索引查询;高频头插删场景除外。

在java里如何用list与map实现一个联系人管理系统_java集合操作与数据存储说明

ArrayList 存联系人对象比用 LinkedList 更合适

联系人管理中增删操作不频繁,但遍历、按索引查(如分页展示第5~10个)和随机访问多。ArrayList 的数组结构支持 O(1) 随机访问,而 LinkedList 查第n个元素要 O(n) 遍历指针。
除非你确定会高频在列表头部插入/删除(比如实时消息队列),否则别为了“听起来更高级”选 LinkedList
实操建议:
• 直接声明为 List 接口类型,方便后期替换实现类
• 初始化时预估容量(如 new ArrayList(100)),避免多次扩容复制数组
• 不要存 null 联系人,统一用 Optional 或判空逻辑处理

HashMap 做手机号快速查找

用户常按手机号查联系人,这是典型的 key-value 查询场景。用手机号作 key,Contact 对象作 value,get() 时间复杂度稳定 O(1)。
注意几个关键点:
• 手机号必须标准化:统一去空格、去短横线、补国家码前缀(如 +86),否则 “138-1234-5678” 和 “13812345678” 会被当成两个 key
• key 不能用 Contact 对象本身——它没重写 equals()hashCode() 就会导致查不到
• 如果允许一个号码绑定多个联系人(如家庭共用号),就改用 Map>
• 别把 HashMap 当成数据库:它不支持模糊搜索(如“姓张的”)、范围查询(如“创建时间最近7天”),这类需求得靠遍历 values() 或引入额外索引结构

增删改查时别直接操作原始集合,封装成方法再加校验

很多人写到一半发现:添加重复手机号没拦截、删除时传了 null ID 导致 NPE、修改姓名后没同步更新 Map 的 key……这些不是语法错误,是业务逻辑裸奔。
实操建议:
• 添加联系人前,先用 map.containsKey(phone) 检查是否已存在
• 删除时,用 map.remove(phone) 同时从 Map 和 List 中移除,别只删 List 导致 Map “脏数据”
• 修改手机号必须两步:先 map.remove(oldPhone),再 map.put(newPhone, contact),并确保 List 中的 contact 对象字段也更新(或重建对象)
• 所有 public 方法入口加 Objects.requireNonNull(contact, "contact cannot be null"),别让异常穿透到 UI 层

DecoHack
DecoHack

DecoHack是一个专注分享产品设计、开发、运营与推广的博客周刊

下载

导出联系人列表时,list.stream().sorted(...).collect(...) 比手写冒泡安全

用户要求“按姓名拼音排序”或“按添加时间倒序”,这时候别自己写排序逻辑。Java 8+ 的 Stream API 可读性高、不易出错,且底层复用 Arrays.sort() 的优化实现。
示例:
list.stream().sorted(Comparator.comparing(Contact::getName)).collect(Collectors.toList())
注意:
sorted() 返回新 List,原 list 不变;如果想原地排序,用 Collections.sort(list, comparator)
• 中文姓名排序要用 Collator.getInstance(Locale.CHINA),否则 “王” 和 “李” 可能按 Unicode 码点排错(“李”U+674E,“王”U+738B,实际“李”应在“王”前)
• 如果 list 很大(>10万条),排序可能卡顿,考虑前端分页 + 后端只返回当前页数据,而不是全量排序再切片

立即学习Java免费学习笔记(深入)”;

实际落地时最常被忽略的是数据一致性:List 和 Map 两个容器内容必须严格同步。哪怕只漏掉一次 map.put(),后续按号码查就会“明明刚存过却找不到”。建议把所有增删改操作收拢进一个 ContactManager 类,禁止外部直接访问内部集合。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

241

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

621

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

398

2023.09.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1297

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

276

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2200

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

34

2026.01.19

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

47

2025.09.03

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.8万人学习

Java 教程
Java 教程

共578课时 | 59.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号