import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* 报表数据存储用 yxy 20091020
*
*/
public class ReportData extends LinkedHashMap {
private static final Log logger = LogFactory.getLog(ReportData.class);
public static void main1(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
String key = "1";
String value = "2";
ReportData rData = new ReportData();
rData.put(arrayList, key, value);
}
public static void main(String[] args) {
ArrayList path = new ArrayList();
ReportData rData = new ReportData();
// 添加笔数
path.clear();
path.add("1001");
path.add("1");
path.add("0");
path.add("1");
rData.put(path, "COUNT", "888");
}
public void put(ArrayList arrayList, Object key, Object value) {
ReportData rData = this;
for (int i = 0; i < arrayList.size(); i++) {
Object arrayObj = arrayList.get(i);
boolean flag = rData.containsKey(arrayObj);
if (flag) {
rData = (ReportData) rData.get(arrayObj);
} else {
ReportData nData = new ReportData();
rData.put(arrayObj, nData);
rData = nData;
}
}
rData.put(key, value);
}
}
44行:ReportData rData = this; // rData 指向this,即当前对象
第一次循环
54行:rData.put(arrayObj, nData); // 该句执行完后 this里面是{1001={}}
55行:rData = nData; // 该句执行完后 rData里面是{}
第二次循环
54行:rData.put(arrayObj, nData); // 该句执行完后 this里面是{1001={1={}}} 问题:rData里面 是空,赋完值后还影响this里面内容。
55行:rData = nData; // 该句执行完后 rData里面是{}
那么问题来了。
当第一次循环后rData是null(也就是说第一次循环后rData不再指向this,与this脱离关系了)。
为什么第二次循环到54行赋值完后,还会影响this里面内容。
感觉有点奇怪,一直没搞明白。
------解决思路----------------------
我是这样认为的
第一次循环完以后的情况如下
第二次循环修改完rData的内容后,this的内容也随之修改了
------解决思路----------------------
就是第一次循环完成后,rData指向的是this中key值为1001所对应的对象
当你修改rData所指向的对象时,修改的也就是this中key值为1001所对应的对象
------解决思路----------------------
把this叫做对象A,,第一次循环产生的rData叫做对象B,第二次循环产生的rData叫做对象C。
第一次循环后
B是空的, 所以B是{}
A有B的引用,所以A是{1001=B},即{1001={}}
第二次循环后
C是空的, 所以C是{}
B有C的引用,所以B是{1=C},即{1={}}
虽然rData不再指向A,但this指向A,A对象仍然存在
A仍然有B的引用,A是{1001=B},但是B变成了{1={}},因此A也就是this是{1001={1={}}}
------解决思路----------------------
54行执行的时候,相当于this.put(arrayObj, nData);
55行相当于rData = this.get(arrayObj);
之后循环在多次,对rData的操作,都是对this.get对应的value,或者value的get的value(不断往里类推)的操作 ,再怎么操作,都是在this这个map里的操作了,有点像深度队列。