1

所以是的,我只是想看看是否有一种更优雅的方式来做我下面要做的事情(请记住,我想要与 POJO(普通 Java 对象)相关的答案,因为这个问题是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;
 }

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

4

2 回答 2

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消除一个哈希表查找。

但是,这是否会对您的系统性能产生重大影响是值得怀疑的……除非该getUniqueId()方法做一些愚蠢的事情,例如每次调用它时计算一个 MD5 总和。(显然它没有。)

尽管有性能,但我会进行此更改,因为它使代码更易于阅读...... IMO。

于 2011-02-08T00:26:26.643 回答
-1

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

imgs.keySet().retainAll(stillValidKeys);

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

于 2011-02-08T03:46:33.337 回答