循环往list中add对象却总是add的是一个对象

探讨Java中循环向List添加对象时遇到的问题:由于每次循环只是设置对象属性,导致List中对象被重复覆盖。文章提供解决方案,强调在循环内部创建新对象以避免重复。
  •  在new 一个对象的时候,对象的ID是唯一确定的;将对象add入list中时,放入list中的其实是对象的引用 ;而每次循环只是简单  的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;
  •  所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前add的对象。所以循环之后list中的对象是重复的对象。
  •  想要避免这个问题只要每次add时保证对象引用都是不同的即可,即每循环一次重新new一个对象。
  • new的对象应该放在for循环内,每循环一次重新new一个新对象
    1. List<MaterialPriceInfoModel> listModel = new ArrayList<MaterialPriceInfoModel>();
    2. MaterialPriceInfoModel model = new MaterialPriceInfoModel();</span>
    3. int num=0;
    4. for (int i = 1, j = sheet.getLastRowNum(); i <= j; i++) {
    5. model.setSupplyId(supplyId);
    6. model.setSupplyCode(SupplyCode);
    7. model.setSupplyName(SupplyName);
    8. MaterialPriceInfoKey theKey = (MaterialPriceInfoKey) bizImpl.insert(model);
    9. if(theKey!=null){
    10. num++;
    11. System.out.println("成功导入1条数据!");
    12. }
    13. listModel.add(model);
    14. }
    15. theForm.setListModel(listModel);


Java 中,`List` 是一种用于存储和操作对象集合的常用数据结构。如果需要向 `List` 中的每个对象一个字段(即为对象属性),可以通过遍历列表并在循环中对每个对象执行修改操作来实现。 例如,假设有一个 `Person` 类,并希望向其中动态添一个字段: ```java class Person { private String name; public Person(String name) { this.name = name; } public void addField(String fieldName, Object value) { // 通过反射或特定逻辑实现字段的动态添 } } ``` 接下来,使用循环向 `List` 中的每个对象字段: ```java List<Person> people = new ArrayList<>(); people.add(new Person("Alice")); people.add(new Person("Bob")); for (Person person : people) { person.addField("age", 30); // 假设 addField 方法已定义好 } ``` 如果字段是静态已知的,则可以直接扩展类定义并直接赋值[^2]: ```java class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } } // 在创建对象时直接初始化新增字段 List<Person> people = new ArrayList<>(); people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); ``` 对于更复杂的动态字段需求,可以使用 `Map` 来模拟字段的添: ```java List<Map<String, Object>> dynamicPeople = new ArrayList<>(); Map<String, Object> alice = new HashMap<>(); alice.put("name", "Alice"); alice.put("age", 30); dynamicPeople.add(alice); Map<String, Object> bob = new HashMap<>(); bob.put("name", "Bob"); bob.put("age", 25); dynamicPeople.add(bob); ``` 这种方式利用了 `Map` 的灵活性,使得每个对象都可以拥有不同的字段。 ### 使用 Java 集合框架特性 Java 的 `List` 接口支持多种操作,包括 `add`, `set`, 和 `subList` 等方法[^4]。如果目标是批量更新对象,可以结合 `ListIterator` 或 `subList` 来优化性能: ```java List<Person> people = new ArrayList<>(); people.add(new Person("Alice")); people.add(new Person("Bob")); List<Person> subList = people.subList(0, 2); for (Person person : subList) { person.addField("country", "USA"); } ``` 由于 `subList` 返回的是原列表的一个视图,因此对子列表的操作会直接影响原列表。 ### 示例代码 以下是一个完整的示例,展示如何在 `List` 中为每个对象字段: ```java import java.util.ArrayList; import java.util.List; class Person { private String name; public Person(String name) { this.name = name; } public void addField(String fieldName, Object value) { System.out.println("Adding field: " + fieldName + " with value: " + value + " to " + name); // 这里仅为演示,实际应用中可采用反射或其他方式实现字段动态添 } @Override public String toString() { return "Person{name='" + name + "'}"; } } public class Main { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("Alice")); people.add(new Person("Bob")); for (Person person : people) { person.addField("age", 30); } } } ``` ### 总结 - 如果字段是静态的,可以直接通过类定义和构造函数实现。 - 如果字段是动态的,可以使用 `Map` 或反射机制。 - 利用 `subList` 可以简化部分场景下的批量操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值