Draymonder

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

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-09-12
  • 2022-01-23
  • 2022-01-01
  • 2021-07-09
猜你喜欢
  • 2021-08-08
  • 2021-07-07
  • 2021-08-08
  • 2021-04-09
  • 2021-10-15
相关资源
相似解决方案