所以是的,我只是想看看是否有一种更优雅的方式来做我将要做的事情(请记住我想要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;
}
我想知道这听起来是否合法,还是能以更有效的方式完成?
答案 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);
}
注意:
get
代替contains
可以消除一个哈希表查找。然而,令人怀疑的是,这会对您的系统性能产生重大影响......除非getUniqueId()
方法做了一些愚蠢的事情,比如每次调用它时计算一个MD5总和。 (显然它没有。)
尽管有性能,但我会做出这样的改变,因为它使代码更容易阅读...... IMO。
答案 1 :(得分:-1)
如果您已经有一个包含要保留的图像键的集合,那么您可以简单地执行以下操作:
imgs.keySet().retainAll(stillValidKeys);
但是,如果您拥有的只是一个列表,那么您当前的代码可能就足够了。