……
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);语句才该有这个结果,怎么没有这个操作,它也能正确输出新值呢?

解决方案 »

  1.   

    忘了一段代码
    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]); 
        } 
      

  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]); 
      

  3.   

    我还是没有明白,
    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对应的值也作了修改呢?
      

  4.   

    if条件为真时,说明你的hashtable里面已经存在"7341"这个key啦,当然可以输出正确的值。可能程序的别的地方执行过addCache(String key, Object value) 的方法
      

  5.   

    java里面String是对象,temp 是key所对应String数组对象的一个引用,对引用的操作都是直接操作对象本身,对temp的操作直接就会改变对象的值
      

  6.   

    你看是不是是少了一个步骤吧,先把这些临时变量放入cache,在输出就是正常的。
    我怀疑这里漏了句      //不明白的地方....
    cache.put(key,temp);
     String[] cacheTemp= (String[])cache.get(key);
    ........
      
      

  7.   

    "java里面String是对象,temp 是key所对应String数组对象的一个引用,对引用的操作都是直接操作对象本身,对temp的操作直接就会改变对象的值"
    我好像知道点了,但是感觉还是不太清楚,请大家继续发表高论!