我需要这样做:
Dictionary cache;
cache = new Hashtable();
this.getDocument().putProperty("imageCache", cache);
然后我有一个方法:
cache.put(url, picture);
图片是图片对象。 我这样创造:
public Image getSmiley(String smileyName) {
BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
ImageIcon myicon = new ImageIcon(getClass().getResource("/ola/smileys/" + smileyName + ".png"));
myicon.paintIcon(null, g, 0, 0);
return img;
}
我已经运行了一个分析,我已经看到当我将此方法称为“put”时,应用程序的运行速度令人难以置信。可能是什么原因?
非常感谢。
最好的问候
答案 0 :(得分:5)
我怀疑这可能是由于您使用URL
类作为密钥类型。
URL.equals(Object)
的{{3}}说明了这一点:
如果两个URL对象具有相同的协议,引用等效主机,主机上具有相同的端口号,以及文件的相同文件和片段,则它们是相等的。
如果两个主机名都可以解析为相同的IP地址,则认为两台主机是等效的。否则,如果无法解析任何一个主机名,则主机名必须相等而不考虑大小写;或两个主机名都等于null。
由于主机比较需要名称解析,因此此操作是阻止操作。
当您使用URL
实例作为地图中的键时,每次将某个键与另一个键进行比较时,您可能会触发DNS查找...这可能需要很长时间。< / p>
如果这是您的问题,那么您需要将地图的密钥类型更改为String
或URI
...或其他没有昂贵费用的equals(Object)
方法
答案 1 :(得分:2)
我只是在猜测,但我认为这可能是由于必须调整底层哈希结构的大小。
当你将一个值放入哈希表时,一旦达到某个容量,它就必须扩展底层数组 - 否则,你最终会得到很多哈希冲突。但是,这种数组扩展操作很昂贵 - 它必须为新数组分配空间并将值复制到新数组中。
一个建议是为Hashtable构造函数提供合理的初始容量。
答案 2 :(得分:1)
“难以置信”多少钱?
我无法保证会有多大改进,但请尝试使用HashMap
代替Hashtable
。 HashMap
未同步,我猜这里你不需要,因为无论如何都应该在你的用户界面的一个线程上完成。
有关这些差异的其他详细信息,请参阅Differences between HashMap and Hashtable?。
答案 3 :(得分:0)
我假设您正在尝试预加载缓存,以便您可以执行类似在JEditorPane中显示本地图像的操作。
我刚遇到这个问题&amp; Stephen C正确地确定了这个问题。
最初我使用的是以http://开头的网址,我切换到以file:/开头的网址,并修复了问题。
这些网址实际上从未连接过,它们只是哈希的唯一键,因此只需确保URL对象知道它不需要DNS查找来解决它们就足够了,&amp;更改为文件协议就可以了。