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

版权声明:本文为Draymonder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Draymonder/p/10096163.html