Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建固定长度数组值的Java映射?_Java_Arrays_Map - Fatal编程技术网

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

如何创建固定长度数组值的Java映射?,java,arrays,map,Java,Arrays,Map,我有一个程序,需要存储两个简单的int值,并将每个值与一个字符串键相关联。当前我初始化此成员,如下所示: private Map<String, int[]> imageSizes = new HashMap<String, int[]>(); private-Map-imageSizes=new-HashMap(); 然后用类似于imageSizes.put(“some key”,newint[]{100200})的东西附加到它上面 我的问题是-有没有办法给这些值一

我有一个程序,需要存储两个简单的int值,并将每个值与一个字符串键相关联。当前我初始化此成员,如下所示:

private Map<String, int[]> imageSizes = new HashMap<String, int[]>();
private-Map-imageSizes=new-HashMap();
然后用类似于
imageSizes.put(“some key”,newint[]{100200})的东西附加到它上面

我的问题是-有没有办法给这些值一个固定的长度?我将永远只需要在每个元素2个元素。如果我试图在成员定义中给数组一个长度,Java不喜欢这种语法


此外,在这种情况下限制数组长度是否有任何好处,或者我只是过于热衷于优化?

您可以将其封装在一个简单、可重用且自文档化的类中:

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));
// ...
Map size=newhashmap();
尺寸。放置(“一些键”,新尺寸(100200));
// ...

您可以使用扩展HashMap的类,并提供以下特殊功能:

public class ImageHashMap extends HashMap<String, int[]> {
    public void putArray(String key, int a, int b) {
      put(key, new int[]{a, b});
    }
}

除了Bohemian的解决方案外,您可能还希望保护原始put方法不受HashMap的影响,如下所示:

@Override
public int[] put(String key, int[] value) {
    throw new UnsupportedOperationException("Sorry, operation not allowed.");
}

newint[]
仅在数组元素以大括号跟随并且编译器可以计算其数量的构造中才合法。在映射中,用于值的内存量只是引用的大小(32或64位),而不管数组本身有多大。因此,固定数组的大小不会改变映射使用的内存量。在C语言中,您可以声明一个指针,然后为其分配更多或更少的内存(或者忘记分配任何内存并崩溃);Java为您管理内存。

既然该类旨在用于
哈希映射
,是否有必要(或至少建议)重写
哈希代码
等于
?@Gabriel:这只适用于键<代码>字符串
已经重写了。哦,我明白了。谢谢你的澄清。这肯定是干净利落的方式,谢谢。。。我猜我最初的问题不是那么清楚,它更多的是一个低级内存优化问题,而不是架构问题(:我怀疑是否有好处。映射只是存储对值的引用,而不是值的副本。我认为根本没有发生任何优化。我一直认为创建一个
新int[100]
将为100个值分配内存,而
new int[]将分配一些编译器声明为“足够”的量,并在其用完时调整大小。在Java中并非如此?当然,所有这些都只适用于基本类型…
new int[]
仅在数组元素以大括号跟随并且编译器可以计算其数量的构造中才合法。我的观点是,在映射中,用于值的内存量只是引用的大小,而不管数组本身有多大。因此,固定数组的大小不会改变映射使用的内存量。In C,您可以声明一个指针,然后为其分配更多或更少的内存(或者忘记分配任何内存并崩溃);Java不是这样工作的。太棒了。如果您做出正确的回答,我会将其标记为已接受且有用(:
@Override
public int[] put(String key, int[] value) {
    throw new UnsupportedOperationException("Sorry, operation not allowed.");
}