List.add()方法使用时被覆盖

本文深入探讨了Java中向集合添加自定义类对象时,由于添加的是对象引用而导致的数据覆盖问题。通过具体代码示例,解释了在循环中重复使用同一对象实例进行集合添加时,如何因对象状态的更新而使集合中的所有元素指向同一状态,以及如何通过在每次循环中创建新对象来解决这一问题。

代码如下:

public class AddExecption {

public static  void  main(String[] args){

    List<String> list = new ArrayList<>();
    String aa = new String();
    User user = new User();
    List<User> list1 = new ArrayList<>();
    for (int i = 0; i < 1; i++){
        aa = "11";
        list.add(aa);
        aa = "22";
        list.add(aa);
        aa = "33";
        list.add(aa);
        //
        user.setName("lihua");
        user.setId("111");
        list1.add(user);
        user.setName("lilei");
        user.setId("222");
        list1.add(user);
    }
    for (int i = 0; i < list.size(); i++){
        System.out.println(list.get(i));
    }
    for (int i = 0; i < list1.size(); i ++){
        System.out.println(list1.get(i).getName()+list1.get(i).getId());
    }

}

  public static class User{
    private String name;
    private String id;

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public String getId() {
      return id;
  }

  public void setId(String id) {
      this.id = id;
  }
  }
}

结果:

11
22
33
lilei222
lilei222

自定义的类User使用add方法时将前面的数据覆盖了,
原因是:add加进去的是对象的一个引用,使用同一个对象时,每次都更新了这个引用的值,所以list里面的值都一样的。
解决方法:在每一次使用都new 一下对象,如果是在循环中使用,就将new 放在循环里面就好。

public class AddExecption {
public static  void  main(String[] args){
    List<String> list = new ArrayList<>();
    String aa = new String();
    List<User> list1 = new ArrayList<>();
    aa = "11";
    list.add(aa);
    aa = "22";
    list.add(aa);
    aa = "33";
    list.add(aa);
        //
    User user = new User();
    user.setName("lihua");
    user.setId("111");
    list1.add(user);
    User user1 = new User();
    user1.setName("lilei");
    user1.setId("222");
    list1.add(user1);
    for (int i = 0; i < list.size(); i++){
        System.out.println(list.get(i));
    }
    for (int i = 0; i < list1.size(); i ++){
        System.out.println(list1.get(i).getName()+list1.get(i).getId());
    }
}
  public static class User{
    private String name;
    private String id;
  public String getName() {
      return name;
  }
  public void setName(String name) {
      this.name = name;
  }
  public String getId() {
      return id;
  }
  public void setId(String id) {
      this.id = id;
  }
}
}
### 添加类名失败的常见原因及解决办法 在使用 `classList.add` 添加类名,如果类名没有生效,可能是由于以下几种原因: #### 1. 元素未正确获取 确保通过 `document.getElementById`、`document.querySelector` 等方法正确获取了目标元素。如果元素未找到,调用 `classList.add` 会抛出错误。 ```javascript const element = document.getElementById("test"); if (element) { element.classList.add("new-class"); } ``` 如果元素不存在,代码中应添加条件判断以避免错误 [^1]。 #### 2. 类名已存在 `classList.add` 方法不会覆盖已存在的类名,也不会报错。如果类名未生效,可能是该类名已经存在于元素的 `class` 属性中。 ```javascript const element = document.getElementById("test"); element.classList.add("new-class"); // 如果 "new-class" 已存在,不会重复添加 ``` 可以使用 `classList.contains` 方法检查类名是否存在,再决定是否添加: ```javascript if (!element.classList.contains("new-class")) { element.classList.add("new-class"); } ``` #### 3. CSS 优先级问题 即使类名成功添加,如果 CSS 样式未生效,可能是由于其他样式规则的优先级更高。例如,某个选择器的权重更高,或者使用了 `!important`。 ```css .test-class { color: red !important; } .new-class { color: blue; } ``` 在 JavaScript 中添加 `new-class` 后,文本颜色仍可能为红色,因为 `.test-class` 的优先级更高。可以通过调整 CSS 选择器的权重或使用 `!important` 来解决此问题 [^1]。 #### 4. 元素动态更新 如果元素是动态生成的(例如通过 AJAX 请求加载),可能在 DOM 加载完成之前执行了 `classList.add`,导致类名未被正确应用。可以将代码放在 `DOMContentLoaded` 事件中,确保 DOM 完全加载后再执行操作: ```javascript document.addEventListener("DOMContentLoaded", function () { const element = document.getElementById("test"); if (element) { element.classList.add("new-class"); } }); ``` #### 5. 元素被其他脚本修改 如果页面上有其他脚本在 `classList.add` 之后移除了该类名,可能会导致类名未生效。可以通过调试工具检查元素的 `class` 属性变化,确认是否有其他代码干扰了类名的添加。 ```javascript const element = document.getElementById("test"); element.classList.add("new-class"); // 检查类名是否被正确添加 console.log(element.classList); ``` #### 6. 浏览器兼容性问题 虽然 `classList` 在现代浏览器中广泛支持,但在某些旧版本浏览器(如 IE9 及以下)中可能不兼容。如果目标环境需要兼容旧浏览器,可以使用 `className` 属性手动拼接类名: ```javascript const element = document.getElementById("test"); if (element) { const classes = element.className.split(" "); if (classes.indexOf("new-class") === -1) { element.className += " new-class"; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值