找准目标,不断前行

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() 方法时出现空指针异常。

本文将通过代码示例,详细对比以下两种初始化方式的区别:

  1. 使用循环逐个添加新对象(推荐)
  2. 使用数组转换成 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(...);

 

posted @ 2025-06-24 14:27  kevinZhuZhu  阅读(64)  评论(0)    收藏  举报