我的应用程序使用多个Hashmaps存储Color和Image对象,这些对象在每次出现新Key时都会随机生成(可能是无限量)。
为减少内存使用量,我正在使用哈希函数将随机生成的颜色和图像的数量限制为229。 奇怪的是,当我存储几乎无限的颜色和图像时,该程序运行时没有出现重大问题(当然,除了泄漏)。
现在,我试图在几秒钟后奇怪地重复使用有限的对象集,但我不断收到异常:
org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTError: No more handles)
地图的生成如下所示:
static Map<Integer, Color> color = new Hashtable<>();
private static final int MAX_COLORS = 229;
private static void generateColor(String typeName) {
if (mapping.containsKey(typeName)) {
return;
}
Color c = generateRandomColor(typeName);
color.put(typeNameHash(typeName), c);
}
private static Color generateRandomColor(String typeName) {
if(color.containsKey(typeNameHash(typeName))){
return color.get(typeNameHash(typeName));
}
int red = random.nextInt(255);
int green = random.nextInt(255);
int blue = random.nextInt(255);
return new Color(Display.getCurrent(), red, green, blue);
}
private static int typeNameHash(String typeName){
return Math.abs(typeName.hashCode())%MAX_COLORS;
}
现在怎么可能我应该有更少的对象,而我却如此快地遇到这种异常?
谢谢!
答案 0 :(得分:0)
这里问题的解决方案是,我仍在使用字符串作为键,而不是在某些情况下对字符串调用哈希函数。 由于HashMaps采用对象类型作为键,因此编译器没有对此发出警告。
检查我插入到Hashmap中的所有代码部分,并确保在各处都使用了哈希函数,即可解决此问题。