美文网首页
ArrayList.add后,前面数据被覆盖的问题及解决方法

ArrayList.add后,前面数据被覆盖的问题及解决方法

作者: 樂m | 来源:发表于2020-09-07 18:48 被阅读0次

    记录遇到的问题,以作总结 


    导致原因:

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

    1.涉及循环添加

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

    Object obj;

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

        obj = new Object();

        // obj = anotherObj;

        list.add(obj);

    }

    像上面一样,每次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;

        }

    }


    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.csdn.net/zouhaipeng/article/details/53160124

    相关文章

      网友评论

          本文标题:ArrayList.add后,前面数据被覆盖的问题及解决方法

          本文链接:https://www.haomeiwen.com/subject/doplektx.html