如何创建固定长度数组值的Java映射?

4

我有一个程序,需要存储一些简单的int值,并将每个值与一个字符串键相关联。目前,我是这样初始化这个成员的:

private Map<String, int[]> imageSizes = new HashMap<String, int[]>();

然后可以通过类似 imageSizes.put("some key", new int[]{100, 200}); 的方式将其附加到其中。

我的问题是 - 是否有一种方法可以给这些值一个固定的长度?每个数组中我只需要2个元素。如果我尝试在成员定义中为数组指定长度,Java会报错。

此外,在这种情况下限制数组长度是否有益处,还是我在优化方面过于热衷了?


我怀疑是否有任何好处。Map 仅仅存储了对值的引用,而不是值的副本。我认为根本没有进行任何优化。 - Andrew Lazarus
我一直以为创建一个 new int[100] 会为100个值分配内存,而 new int[] 则会分配由编译器声明为“足够”的某些数量,并在用完时调整大小。但在Java中不是这样吗?当然,所有这些只适用于原始类型... - pospi
1
new int[] 仅在构造中,数组元素跟随在大括号中且编译器可以计数时才合法。我的观点是,在 Map 中,用于值的内存量只是引用大小,无论数组本身有多大。因此,调整数组大小不会改变映射使用的内存量。在 C 中,您可以声明一个指针,然后为其分配更多或更少的内存(或忘记分配任何内存并崩溃);Java 不是这样工作的。 - Andrew Lazarus
很棒。 - pospi
4个回答

3
你可以将其封装在一个简单、可重用且自我说明的类中:
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));
// ...

由于该类旨在用于 HashMap 中,因此重写 hashCodeequals 是必要的(或至少是推荐的),对吗? - Gabriel Negut
@Gabriel:那只适用于键。String已经重写了它们。 - BalusC
那肯定是一个整洁的做法,谢谢...我想我的原始问题并不是很清楚,它更像是一个低级内存优化问题而不是架构问题(: - pospi

3

您可以使用扩展了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);

3
new int[]只有在大括号中跟随着数组元素且编译器可以计算出元素个数的情况下才是合法的构造方法。在Map中,用于值的内存量仅为引用的大小(32位或64位),不管数组本身有多大。因此,固定数组的大小并不会改变map使用的内存量。在C中,您可以声明指针,然后分配更多或更少的内存给它(或者忘记分配内存而导致崩溃);Java会为您管理内存。

0
除了Bohemian的解决方案之外,您可能还想这样保护HashMap中的原始put方法:
@Override
public int[] put(String key, int[] value) {
    throw new UnsupportedOperationException("Sorry, operation not allowed.");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接