Java中初始化固定大小List的两种方式对比——别让null对象害你NullPointerException
//方法1
int fixedSize = 5;
List<RcGroupConfEntity> list = new ArrayList<>();
// 初始化固定个数的对象并放入 list2
for (int i = 0; i < fixedSize; i++) {
RcGroupConfEntity entity = new RcGroupConfEntity();
list2.add(entity);
}
//方法2
List<RcGroupConfEntity> list = new ArrayList<>(Arrays.asList(new RcGroupConfEntity[5]));
的区别
最开始我使用的是第二种,但是一直 list.get(i).setxxx报错,我纳闷了, 我对象有的啊,为啥还是给我报错???
在 Java 开发中,我们经常需要初始化一个固定大小的 List,比如用于占位、批量处理等场景。然而,很多开发者在使用 Arrays.asList(new T[n]) 初始化 List 时,会不小心踩坑,导致后续调用 .setXXX() 方法时出现空指针异常。
本文将通过代码示例,详细对比以下两种初始化方式的区别:
- 使用循环逐个添加新对象(推荐)
- 使用数组转换成 List(快捷但有陷阱)
一、方式一:循环添加对象(推荐)
int fixedSize = 5;
List<RcGroupConfEntity> list2 = new ArrayList<>();
for (int i = 0; i < fixedSize; i++) {
RcGroupConfEntity entity = new RcGroupConfEntity();
list2.add(entity);
}
✅ 特点:
| 特性 | 描述 |
|---|---|
| 每个元素都是真实存在的对象 | ✅ 可以直接调用 .setXXX() 方法 |
| 安全性高 | ✅ 不会出现空指针异常 |
| 灵活性好 | ✅ 可根据索引或逻辑动态构造不同对象 |
示例:为每个对象赋初始值
for (int i = 0; i < fixedSize; i++) {
RcGroupConfEntity entity = new RcGroupConfEntity();
entity.setGroupName("组" + (i + 1));
list2.add(entity);
}
二、方式二:数组转 List(快捷写法)
List<RcGroupConfEntity> list2 = new ArrayList<>(
Arrays.asList(new RcGroupConfEntity[5])
);
❌ 注意事项:
| 特性 | 描述 |
|---|---|
| 所有元素初始为 null | ❌ 调用 .get(i) 返回 null |
| 本质是一个“装箱”操作 | ✅ 把一个数组包装成 List |
| 适合占位/预分配 | ⚠️ 但需要后续手动填充对象 |
❌ 使用时容易出错:
list2.get(0).setPersonConfList(...); // ❌ NullPointerException
因为 list2.get(0) 是 null。
🧪 总结对比表
| 对比项 | 循环添加(推荐) | 数组转 List |
|---|---|---|
| 是否包含真实对象 | ✅ 是 | ❌ 否(全是 null) |
| 能否直接调用 set 方法 | ✅ 是 | ❌ 否 |
| 是否安全 | ✅ 高 | ❌ 低 |
| 初始化是否灵活 | ✅ 高(可自定义) | ❌ 低 |
| 写法是否简洁 | ❌ 多几行代码 | ✅ 简洁 |
| 适合场景 | ✅ 实际业务逻辑中频繁访问属性 | ✅ 占位、后期再赋值的情况 |
✅ 推荐使用方式(总结)
- 如果你要 立刻使用这些对象(比如设置属性、调用方法),请使用 方式一:循环创建并添加对象。
- 如果你只是想 预先分配空间,并且后面再一个个赋值,可以用方式二,记得加上非空判断:
if (list2.get(i) == null) {
list2.set(i, new RcGroupConfEntity());
}
list2.get(i).setPersonConfList(...);

浙公网安备 33010602011771号