Java pojo - 在迭代新数据集合后回收缓存的Hashtable值

时间:2011-02-07 23:44:55

标签: java arrays hashtable enumeration pojo

所以是的,我只是想看看是否有一种更优雅的方式来做我将要做的事情(请记住我想要POJO(Plain-Old Java Objects)相关答案,因为这个问题与J2ME有关,所以没有只在Java 1.5及以上版本中找到的泛型和现代数据结构):

假设我有一个对象MyImage,它只是一个简单的bean对象,它填充了来自网络调用的数据到我的服务器。它包含的所有内容都是与我的应用程序相关的所有图像的元数据,更重要的是,它包含一个唯一的标识符,用于构造URL以便从我的服务器获取该对象的图像。当我提出请求时,我经常收到一组新的对象,其中一些与之前的请求相同。

现在,即使我能够下载图像,问题还在于如何以一种方式缓存图像数据,当我收到一组新的MyImage对象时,我会将它们交叉引用到我的缓存中并且只保留如果已经下载了MyImage对象的图像。换句话说,当我将下载的图像保存到Hashtable缓存时,我使用构造的URL(MY_IMAGE_SERVER + myImageUniqueId)键入图像数据。当我得到一组新的MyImage对象时,目前我会执行以下操作:

 Hashtable imgs = getImages();

 //If we have cached images, we should see which ones to carry over.
 if(imgs.size() > 0){       
    Hashtable newImgs = new Hashtable();
    for(int i = 0; i < myImages.length; i++){
        MyImage mi = myImages[i];
        if(mi != null && mi.hasImage()){
            //Check if we have the MD5 URL
            if(imgs.containsKey(IMG_URL_PATH + mi.getUniqueId())){
                //Place in new hashtable
                newImgs.put(IMG_URL_PATH + mi.getUniqueId(), imgs.get(IMG_URL_PATH + mi.getUniqueId()));
            }
        }
    }
   _bannerImgs = newImgs;
 }

我想知道这听起来是否合法,还是能以更有效的方式完成?

2 个答案:

答案 0 :(得分:0)

<强>后续

根据评论中代码的假定目的(如下),您的方式似乎是合理的,但您可以进行一些小的优化。将代码的相关部分更改为:

    // Check if we have the image in our cache
    String key = IMG_URL_PATH + mi.getUniqueId();
    Object image = imgs.get(key);
    if (image != null) {
        // Carry over to new cache
        newImgs.put(key, image);
    }

注意:

  1. 创建/使用局部变量可避免创建密钥字符串3次。
  2. 使用get代替contains可以消除一个哈希表查找。
  3. 然而,令人怀疑的是,这会对您的系统性能产生重大影响......除非getUniqueId()方法做了一些愚蠢的事情,比如每次调用它时计算一个MD5总和。 (显然它没有。)

    尽管有性能,但我会做出这样的改变,因为它使代码更容易阅读...... IMO。

答案 1 :(得分:-1)

如果您已经有一个包含要保留的图像键的集合,那么您可以简单地执行以下操作:

imgs.keySet().retainAll(stillValidKeys);

但是,如果您拥有的只是一个列表,那么您当前的代码可能就足够了。