当List中add数据重复覆盖怎么办

当List中add数据重复覆盖怎么办,第1张

注意了,很有可能是你加入得元素是某个bean,且这个bean被你在调用的类中定义成域成员,并实例化了。这时候你再循环改变bean里的内容add()到list中,那么根据java的对象存的是地址的原理,你的list里全是那个实例化bean的地址,最后元素值就全都一样,并且取的是最后一次改变的值。

解决办法是bean被你在调用的类中定义成域成员时不要实例化,到循环内部再实例化,这样就保证了每一个add到list里的对象都是new出来的。

举例说明吧!

ArrayList集合里存的是同一个值,有可能是同一个引用或者就是同一个值。

ArrayList<Object>list = new ArrayList<Object>()

Object obj

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

    obj = new Object()

    // obj = anotherObj

    list.add(obj)

}

像上面一样,每次add的都是同一个引用,一个指向不同对象的引用obj

结果就是集合里所有的值都是obj,obj指向哪,集合里的值就指向哪。

将 Objec new在循环的里面。

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

  Object obj=new Object()

      objt.set(i)

        list.add(obj)

public Class Student {

    private static String id

    private static String name

    public Student(String id, String name) {

        this.id = id

        this.name = name

    }

}

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 = 10i >0i--) {

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

}

//如果输出所有对象,他们的id都是1

上面是第二种情况,每次add()的虽然是不同的对象,但是结果还是被覆盖了,这是为什么呢?

****static****(Student 类中)就是这个修饰符,

让修饰的属性变为静态,

意味着该类的所有对象共享同一个属性

所以尽管集合里存的是不同的对象,但是对象的属性还是同一个值

修改其中任何一个,其他的也会“被修改”


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11896559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存