我有一个程序需要存储几个简单的int值并将每个值与String键相关联。目前我像这样初始化这个成员:
private Map<String, int[]> imageSizes = new HashMap<String, int[]>();
然后使用imageSizes.put("some key", new int[]{100, 200});
我的问题是 - 有没有办法给这些值一个固定的长度?我每个人只需要2个元素。如果我尝试在成员定义中为数组赋予长度,Java不喜欢语法。
此外,在这种情况下限制数组长度是否有任何好处,或者我在优化中是否过于热心?
答案 0 :(得分:2)
您可以将其包装在一个简单,可重复使用且自我记录的类中:
public class Size {
private int width;
private int height;
public Size(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
// Add setters if necessary.
}
使用如下:
Map<String, Size> sizes = new HashMap<String, Size>();
sizes.put("some key", new Size(100, 200));
// ...
答案 1 :(得分:2)
您可以使用扩展HashMap的类并提供此特殊功能:
public class ImageHashMap extends HashMap<String, int[]> {
public void putArray(String key, int a, int b) {
put(key, new int[]{a, b});
}
}
致电:
ImageHashMap im = new ImageHashMap();
im.putArray("some key", 100, 200);
答案 2 :(得分:2)
new int[]
仅在数组元素后跟大括号的构造中是合法的,编译器可以计算多少。在Map中,用于值的内存量只是引用的大小(32或64位),无论数组有多大本身。因此,修复数组的大小不会改变地图使用的内存量。在C中,你可以声明一个指针,然后为它分配更多或更少的内存(或忘记分配任何和崩溃); Java为您管理内存。
答案 3 :(得分:0)
除了Bohemian的解决方案,您可能希望保护原始的put方法不受HashMap的影响:
@Override
public int[] put(String key, int[] value) {
throw new UnsupportedOperationException("Sorry, operation not allowed.");
}