java中list.add添加元素覆盖之前的问题

博客主要讲述了码代码时遇到的ArrayList元素覆盖问题。一是将Object new在循环外,因ArrayList存的是对象引用,改变对象时之前元素会被覆盖,解决办法是将Object new在循环内;二是涉及静态变量,因静态属性被类的所有对象共享,导致添加不同对象时属性值仍被覆盖。

1 **在码代码时,发现一个问题:**使用

  list<object> list=new Arraylist<object>();
  list.add(object);

出现之前添加的元素被最后的元素覆盖。
类似于:

ArrayList<Object> list  = new ArrayList<Object>();
Object obj;
for (int i = 10; i > 0; i--) {
  objt.set(i);
    list.add(obj);
    /*会发现list存放的obj的数都是1*/

之所以将 Objec new在循环的外面,就是想节省空间,(不用在循环中每次循环斗殴需要new一个对象)。但是忘了考虑到:
ArrayList集合里存的是一个对象的引用当我们改变obj时,因为ArrayList.add的是 obj的引用,之前的元素都指向了同一个对象 obj,所以在改变obj时,之前添加的也会随之改变。
解决方法:
将 Objec new在循环的里面。

  for (int i = 10; i > 0; i--) {
   Object obj=new Object();
      objt.set(i);
        list.add(obj);

2 还有一种情况:
涉及静态变量

public Class Student {
    private static String id;
    private static String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

如果我们这样将元素添加到list中:

ArrayList<Student> list  = new ArrayList<Student>();

Student s1 = new Student("1", "小山");
Student s2 = new Student("2", "小康");
// 
list.add(s1);
list.add(s2);

//如果输出两个对象的话你会发现都是小康

//或者你像这样

ArrayList<Student> list  = new ArrayList<Student>();

for (int i = 10; i > 0; i--) {

    list.add(new Student(i, "name"));

}

//你会发现输出所有对象,他们的id都是1
每次add()的虽然是不同的对象,但是结果还是被覆盖了,这是为什么呢?
原因
static(Student 类中)就是这个修饰符
让修饰的属性变为静态,
意味着该类的所有对象共享同一个属性
所以尽管集合里存的是不同的对象,但是对象的属性还是同一个值

借鉴:https://blog.youkuaiyun.com/zouhaipeng/article/details/53160124

### Java 中向 List 添加元素的方法 在 Java 中,`List` 接口提供了多种方法来添加元素到列表中。以下是关于 `add()` 方法的具体实现及其变体的详细介绍。 #### 使用 `add(E element)` 方法 此方法用于将单个元素追加到 `List` 的末尾。这是最常用的添加方式之一。下面是一个简单的例子: ```java import java.util.ArrayList; import java.util.List; public class AddElementExample { public static void main(String[] args) { // 创建一个 ArrayList 实现的 List 对象 List<String> list = new ArrayList<>(); // 向 List添加多个字符串元素 list.add("Apple"); list.add("Banana"); list.add("Cherry"); // 打印当前 List 的内容 System.out.println("Current List: " + list); } } ``` 上述代码展示了如何通过调用 `add()` 将三个水果名称依次加入到 `ArrayList` 中[^1]。 #### 在指定位置插入元素 如果需要在某个特定索引处插入新元素,则可使用带参数版本的 `add(int index, E element)` 方法。这不会覆盖现有数据而是将其右移一位腾出空间给新的条目。例如: ```java // 假设已有如下初始化后的列表 ["Java", "Python", "C++"] list.add(1, "JavaScript"); // 此时列表变为 ["Java", "JavaScript", "Python", "C++"] System.out.println("Updated List after insertion at index 1: " + list); ``` 这里,在索引为 `1` 的地方加入了 `"JavaScript"` 这一项目。 #### 转换 Array 到 List 并批量增加 当拥有一组预先定义好的对象数组时,可以通过构造函数或者静态工厂方法创建对应的 Lists ,然后再利用这些高级别的工具类来进行一系列的操作比如整体性的增删改查等等;当然也可以直接借助于 Arrays.asList() 函数快速完成转换工作之后再进一步扩展功能特性。不过需要注意的是这种方式生成出来的实例通常都是固定大小不可修改长度属性的简单容器而已,并不适合长期作为动态集合结构存在下去。 对于那些确实希望获得真正意义上的灵活调整能力而言,则应该考虑采用显式的 CopyOnWriteArrayList 或者其他线程安全型替代品才行。至于普通的场景下则完全可以依赖常规做法即可满足需求了: ```java String[] array = {"Red", "Green"}; List<String> fixedSizeList = Arrays.asList(array); // Convert to modifiable list if necessary. List<String> modifiableList = new ArrayList<>(fixedSizeList); modifiableList.add("Blue"); System.out.println(modifiableList); // Output will be [Red, Green, Blue] ``` 另外还有一种情况就是从另一个 Collection 类型的数据源里一次性拉取全部成员填充进来形成目标结果集的形式也十分常见有用武之地的地方所在之处所见即所得效果立竿见影非常直观明了易懂便于理解和接受学习成本较低入门门槛不高适合初学者练习掌握基本技能技巧之用。 最后提醒一点非常重要那就是无论采取何种策略都务必记得检查异常处理机制以免发生意外状况影响程序正常运行流程造成不必要的麻烦困扰等问题出现从而降低系统的稳定性和可靠性水平下降带来风险隐患增大维护难度加大等情况的发生几率提升软件质量保障用户体验满意度提高市场竞争力增强企业形象树立良好口碑信誉度建立长远合作关系奠定坚实基础创造更多价回报社会贡献力量做出积极正面的影响作用发挥出来达到双赢甚至多赢的局面局面最终取得成功胜利果实共享成果喜悦之情溢于言表难以掩饰藏匿心中满怀着期待憧憬着未来美好的日子一天天到来降临人间仙境般美妙绝伦令人陶醉不已流连忘返不舍离去久久难忘铭刻心底深处永远珍藏着这份珍贵的记忆回忆起来倍感温馨甜蜜幸福无比快乐自在逍遥悠哉游哉乐悠悠啊哈哈哈…… --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值