zoukankan      html  css  js  c++  java
  • SSM项目问题中遇到 ArrayList添加元素的问题

    记录项目开发中 一次有趣的debug经历

    本来是在做单元测试的,但是发现如下代码 有问题..

    ProductCategory p = new ProductCategory();
    for (int i = 1; i <= 5; i++) {
    	p.setCreateTime(new Date());
    	p.setPriority(i);
            p.setShopId((long)(i));
    	p.setProductCategoryName("测试店铺种类"+(i+3));
    	list.add(p);
    }
    

    打印list里面对象的ProductCategoryName
    发现如下

    测试店铺种类8
    测试店铺种类8
    测试店铺种类8
    测试店铺种类8
    测试店铺种类8
    

    我甚至还以为是ArrayList的add函数会去重 (人工智障),看了一下源码

    public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
    }
    

    发现没什么不妥。
    多测试了几下 发现 list 每次增加对象的时候 list是单纯把相应index赋值为对象。
    因此我上面对象 看似存了5次,但其实,最后打印的时候 打印的是同一个对象, 即最后一次的修改信息
    所以有 5个测试店铺种类8

    正确写法

    每次new一个新的对象 加入到list中

    for (int i = 1; i <= 5; i++) {
    	p = new ProductCategory(null,(long)i,"test"+i+10,i,new Date());
    	//p.setCreateTime(new Date());
    	//p.setPriority(i);
    	//p.setShopId((long)(i));
    	//p.setProductCategoryName("测试店铺种类"+(i+3));
    	list.add(p);
    }
    

    感悟

    本身那么创建一个对象,目的是为了减少内存开销
    但是这样做的结果就是list中存储的对象都是用一个
    特此标注一下 谨防以后再犯错

  • 相关阅读:
    Linux学习总结(18)——Linux使用init命令关机、重启、切换模式
    iOS autorelease使用详解
    iOS xib的使用详解
    iOS ASI--缓存
    iOS ASI--其他用法
    iOS ASI--管理多个请求
    iOS ASI--文件上传
    iOS ASI--文件下载
    iOS ASI--POST请求
    iOS ASI--GET请求
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10096163.html
Copyright © 2011-2022 走看看