记录项目开发中 一次有趣的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中存储的对象都是用一个
特此标注一下 谨防以后再犯错