Java ArrayList添加RecipeItem后旧元素被最新对象覆盖的问题
异常根因定位
你遇到的“ArrayList中所有存储的RecipeItem对象最终都和最后一个新增对象完全一致”的问题,和当前贴出的JSON解析、列表添加代码的逻辑无关,核心问题出在RecipeItem类的定义上。
核心问题诱因
99%的概率是你的RecipeItem类把成员变量写成了static修饰的静态变量,而非普通的实例成员变量:
- 静态变量的内存属于类本身,被类的所有实例共享,不属于某一个单独的对象
- 每次调用
ri.setRecipeName()、ri.setRecipeGuide()时,修改的是全局共享的静态变量,不是当前新建的ri实例的独立属性 - 你往列表中加入的每一个
RecipeItem虽然是不同的对象实例,但它们读取自身属性时,都会指向同一块静态内存区域。等循环执行到最后一次赋值时,这块共享内存存储的是JSON中最后一条食谱的内容,此时遍历列表里所有对象读出来的属性自然全是最后一条食谱的信息,看起来就像所有旧对象都被新对象覆盖了。
验证方法
打开RecipeItem的类定义文件,检查是否存在以下错误写法:
public class RecipeItem { // 错误:添加了static修饰,所有实例共享同一份变量内存 private static String recipeName; private static String recipeGuide; public void setRecipeName(String recipeName) { this.recipeName = recipeName; } public String getRecipeName() { return recipeName; } // 其余get/set方法省略 }
如果类的成员变量前带有static关键字,就和你遇到的异常现象完全匹配。
修复方案
去掉成员变量前的static修饰符,让每个RecipeItem实例拥有独立的属性存储空间:
public class RecipeItem { // 正确:普通实例变量,每个对象独占自己的内存空间 private String recipeName; private String recipeGuide; public String getRecipeName() { return recipeName; } public void setRecipeName(String recipeName) { this.recipeName = recipeName; } public String getRecipeGuide() { return recipeGuide; } public void setRecipeGuide(String recipeGuide) { this.recipeGuide = recipeGuide; } }
其他逻辑排查点
排除静态变量问题后,可再确认以下逻辑没有疏漏:
- 你当前在循环内部通过
new RecipeItem()创建实例的写法是正确的,注意不要把RecipeItem ri = new RecipeItem()的实例化语句挪到循环外面——如果反复修改同一个实例、多次add到列表,也会出现所有列表元素指向同一个对象的问题 - 确认列表添加逻辑是
list.add(ri),没有误写为固定下标的覆盖操作(比如list.set(0, ri)) - 确认列表遍历展示的代码,是依次读取每个列表项自身的属性,不是硬编码固定读取某一个对象的内容
内容的提问来源于stack exchange,提问作者elf4700
相关产品推荐
相关产品推荐

