应使用Person类封装姓名和电话再用Person[]数组管理,避免String[]双数组导致的越界、空指针、数据错乱及扩容困难等问题,并需额外维护size变量记录有效元素数。

用 String[] 存姓名和电话会很快遇到越界和空指针
初学者常直接声明 String[] names = new String[10]; 和 String[] phones = new String[10];,靠下标对齐来管理联系人。但实际操作中:
– 插入第 11 条数据时抛出 ArrayIndexOutOfBoundsException
– 删除中间某条后,留下 null 空位,遍历时必须反复判空
– 姓名和电话靠下标“隐式关联”,一旦数组长度不一致或错位,数据就错乱
– 扩容需手动 new 更大数组 + System.arraycopy(),极易漏拷贝或索引偏移
把联系人封装成类再用 Person[] 数组才可控
定义一个 Person 类,包含 name、phone 字段和必要构造方法,再用对象数组统一管理:
class Person {
String name;
String phone;
Person(String name, String phone) {
this.name = name;
this.phone = phone;
}
}这样做的好处:
– 单个 Person 对象天然绑定姓名与电话,不依赖下标对齐
– 判断是否为空只需 persons[i] != null,比双数组少一半判空逻辑
– 查找、删除时操作的是单个引用,不会误动其他字段
– 后续想加邮箱、地址等字段,只改 Person 类,数组层完全不用动
数组长度固定,所以必须自己维护有效元素数 size
不能依赖 persons.length 当联系人数——那是容量,不是实际数量。必须额外用一个 int size 记录当前已存几条:
立即学习“Java免费学习笔记(深入)”;
- 添加时:先检查
size ,再赋值persons[size++] = new Person(...) - 删除时:把末尾元素挪到被删位置,再执行
size--(避免留空洞) - 遍历时:循环条件是
i ,不是i - 打印全部联系人时,如果
size == 0,直接提示“通讯录为空”,别遍历整个数组
真要扩容,Arrays.copyOf() 比手写复制更安全
当 size == persons.length 时,必须扩容。别自己写循环拷贝:
persons = Arrays.copyOf(persons, persons.length * 2);
注意点:
– Arrays.copyOf() 返回新数组,原引用必须重新赋值,否则扩容无效
– 新数组后半部分自动填 null,不影响 size 控制的访问范围
– 不要用 persons = new Person[persons.length * 2] 然后忘了拷贝——这是最常丢数据的操作
– 如果项目后续要频繁增删,数组就不是最佳结构,该换 ArrayList 了,但入门阶段用数组练逻辑,重点在理解 size 和容量的区别
真正卡住人的从来不是语法,而是没想清楚“我到底要管多少个有效数据”——size 变量漏维护、扩容后忘记重赋值、删完不减 size,这些细节一错,整个通讯录就查不到人、删不对人、显示一堆 null。









