……
private Hashtable cache = new Hashtable();
……
public void addVisitedInfo(String key, String step)
{
if(cache.containsKey(key))
{
String[] temp = (String[])cache.get(key);
temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));
temp[2] = step; //不明白的地方
System.out.println("2222开始时间"+cacheTemp[0]);
System.out.println("2222持续时间"+cacheTemp[1]);
System.out.println("2222访问的步骤"+cacheTemp[2]);
}
else
{
String[] temp = new String[3];
temp[0] = Long.toString(Calendar.getInstance().getTimeInMillis());
temp[1] = "0";
temp[2] = step;
addCache(key, temp);
}
}
public void addCache(String key, Object value)
{
cache.put(key, value);
}不明白的地方是这样,我在跟踪程序时,发现当调用addVisitedInfo方法时,当if条件为真的情况下,三条测试输出语句居然能输出正确的值,比如我在一个地方这样调用addVisitedInfo("7341","[2][3]");当if条件为真时,这条输出语句System.out.println("2222访问的步骤"+cacheTemp[2]);就是输出“2222访问的步骤[2][3]”,我总觉得这个地方不对,因为
我认为应该加了addCache(key, temp);语句才该有这个结果,怎么没有这个操作,它也能正确输出新值呢?
private Hashtable cache = new Hashtable();
……
public void addVisitedInfo(String key, String step)
{
if(cache.containsKey(key))
{
String[] temp = (String[])cache.get(key);
temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));
temp[2] = step; //不明白的地方
System.out.println("2222开始时间"+cacheTemp[0]);
System.out.println("2222持续时间"+cacheTemp[1]);
System.out.println("2222访问的步骤"+cacheTemp[2]);
}
else
{
String[] temp = new String[3];
temp[0] = Long.toString(Calendar.getInstance().getTimeInMillis());
temp[1] = "0";
temp[2] = step;
addCache(key, temp);
}
}
public void addCache(String key, Object value)
{
cache.put(key, value);
}不明白的地方是这样,我在跟踪程序时,发现当调用addVisitedInfo方法时,当if条件为真的情况下,三条测试输出语句居然能输出正确的值,比如我在一个地方这样调用addVisitedInfo("7341","[2][3]");当if条件为真时,这条输出语句System.out.println("2222访问的步骤"+cacheTemp[2]);就是输出“2222访问的步骤[2][3]”,我总觉得这个地方不对,因为
我认为应该加了addCache(key, temp);语句才该有这个结果,怎么没有这个操作,它也能正确输出新值呢?
if(cache.containsKey(key))
{
String[] temp = (String[])cache.get(key);
temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));
temp[2] = step; //不明白的地方
String[] cacheTemp= (String[])cache.get(key);
System.out.println("2222开始时间"+cacheTemp[0]);
System.out.println("2222持续时间"+cacheTemp[1]);
System.out.println("2222访问的步骤"+cacheTemp[2]);
}
当if条件为真时,这条输出语句System.out.println("2222访问的步骤"+cacheTemp[2]);就是输出“2222访问的步骤[2][3]”,我总觉得这个地方不对,因为
我认为应该加了addCache(key, temp);语句才该有这个结果,怎么没有这个操作,它也能正确输出新值呢?
当if条件为真时,说明Hashtable已经存该数组,并且通过
temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));
temp[2] = step;
已经把Hashtable内该key对应的数组给改变了,所以
这条输出语句System.out.println("2222访问的步骤"+cacheTemp[2]);就是输出“2222访问的步骤[2][3]”//不明白的地方
String[] cacheTemp= (String[])cache.get(key);
cacheTemp[0]存储的是数组cacheTemp放入的时间
System.out.println("2222开始时间"+cacheTemp[0]);
cacheTemp[1]的默认值是0,所以经过:temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));cacheTemp[1]存储的是现在时间和放入时间的时间差了
cacheTemp[1]就是放入同一个key值得时间差
System.out.println("2222持续时间"+cacheTemp[1]);
System.out.println("2222访问的步骤"+cacheTemp[2]);
String[] temp = (String[])cache.get(key);
temp[1] = Long.toString(Calendar.getInstance().getTimeInMillis() - Long.parseLong(temp[0]));
temp[2] = step;
这三条语句明明是对临时变量在做操作又不是对Hashtable中key对应的value进行操作,为什么会把Hashtable中key对应的值也作了修改呢?
我怀疑这里漏了句 //不明白的地方....
cache.put(key,temp);
String[] cacheTemp= (String[])cache.get(key);
........
我好像知道点了,但是感觉还是不太清楚,请大家继续发表高论!