Java Hashtable put方法减慢了我的应用程序

时间:2011-12-08 04:24:41

标签: java performance image hashtable put

我需要这样做:

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”时,应用程序的运行速度令人难以置信。可能是什么原因?

非常感谢。

最好的问候

4 个答案:

答案 0 :(得分:5)

我怀疑这可能是由于您使用URL类作为密钥类型。

URL.equals(Object)的{​​{3}}说明了这一点:

  

如果两个URL对象具有相同的协议,引用等效主机,主机上具有相同的端口号,以及文件的相同文件和片段,则它们是相等的。

     

如果两个主机名都可以解析为相同的IP地址,则认为两台主机是等效的。否则,如果无法解析任何一个主机名,则主机名必须相等而不考虑大小写;或两个主机名都等于​​null。

     

由于主机比较需要名称解析,因此此操作是阻止操作。

当您使用URL实例作为地图中的键时,每次将某个键与另一个键进行比较时,您可能会触发DNS查找...这可能需要很长时间。< / p>


如果这是您的问题,那么您需要将地图的密钥类型更改为StringURI ...或其他没有昂贵费用的equals(Object)方法

答案 1 :(得分:2)

我只是在猜测,但我认为这可能是由于必须调整底层哈希结构的大小。

当你将一个值放入哈希表时,一旦达到某个容量,它就必须扩展底层数组 - 否则,你最终会得到很多哈希冲突。但是,这种数组扩展操作很昂贵 - 它必须为新数组分配空间并将值复制到新数组中。

一个建议是为Hashtable构造函数提供合理的初始容量。

答案 2 :(得分:1)

“难以置信”多少钱?

我无法保证会有多大改进,但请尝试使用HashMap代替HashtableHashMap未同步,我猜这里你不需要,因为无论如何都应该在你的用户界面的一个线程上完成。

有关这些差异的其他详细信息,请参阅Differences between HashMap and Hashtable?

答案 3 :(得分:0)

我假设您正在尝试预加载缓存,以便您可以执行类似在JEditorPane中显示本地图像的操作。

我刚遇到这个问题&amp; Stephen C正确地确定了这个问题。

最初我使用的是以http://开头的网址,我切换到以file:/开头的网址,并修复了问题。

这些网址实际上从未连接过,它们只是哈希的唯一键,因此只需确保URL对象知道它不需要DNS查找来解决它们就足够了,&amp;更改为文件协议就可以了。