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中存储的对象都是用一个
    特此标注一下 谨防以后再犯错

  • 相关阅读:
    Dubbo源码分析系列---服务的发布
    Dubbo源码分析系列---扩展点加载
    Jdk动态代理和CGLIB动态代理大比拼
    定时任务的一些思路
    技术人的职业发展
    2017面试碎碎念
    Tiny Mapper
    RabbitMQ 简介
    Load Test Analyzer Overview
    2015 如期而至,你好
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10096163.html
Copyright © 2011-2022 走看看