我正在开发一个Java应用程序,我在程序上实例化一个对象的潜在大量实例,每个实例都有一个图标(BufferedImage),它被选中(基于随机参数)来自10或20个32x32 PNG的银行。
为了优化性能,我有想法将图像加载到静态ArrayList中,而不是将它们存储为参数。然后,当我实例化一个对象时,我检查ArrayList是否包含对象图标。如果没有,它会加载它,但如果它加载,它只保存图像的索引并在需要时查找它。这可能在一个小规模上稍慢一些,但是因为对象的数量远远大于可能的图标数量,所以会占用一点内存。
鉴于图像的大小和我可能拥有的数量,我不认为这种实现方式会产生很大的性能差异,但是存储所有这些重复的BufferedImages只会感觉很糟糕,这是一个有趣的表演驱动。
我的问题是,首先,这是否必要?有更好的方法吗?或者Java虚拟机/缓存/其他一些进程是否为我做了一些工作?
之后,比较BufferedImages的最快方法是什么?这个问题已被其他几个地方问过,我从来没有见过很好的答案。天真的方法是一次比较一个图像数据的每个像素,但这似乎不必要地慢。我考虑使用抗冲突哈希函数,但由于大多数标准版本都是为密码学设计的,因此它们不必要地复杂且故意非常慢。到目前为止,我对此最好的想法似乎只是创建一个自定义图像类,扩展BufferedImage,它有一个图像的src / url字段,然后只需设置每次图像是加载,并基于此进行比较。
答案 0 :(得分:2)
到目前为止,我所拥有的最好的想法似乎只是创造了一个 自定义图像类,扩展BufferedImage,它有一个字段 图像的src / url,然后在每次图像时设置它 加载,并基于此进行比较。
如果这对您的用例有效,即如果图像和URL之间存在一对一的映射,只需创建一个地图,其中URL字符串为键,图像为值:
Map<String, BufferedImage> images = new HashMap<>();
然后,您可以根据网址轻松检索地图:
BufferedImage image = images.get("whatever");
或者,您可以使用Guava之类的缓存实现。