Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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泛型是否允许在诸如short之类的原语数组中节省内存?_Java_Arrays_Generics - Fatal编程技术网

Java泛型是否允许在诸如short之类的原语数组中节省内存?

Java泛型是否允许在诸如short之类的原语数组中节省内存?,java,arrays,generics,Java,Arrays,Generics,我在谷歌上搜索了一下,但我无法找到这个问题的决定性答案。为了澄清,请考虑这样的类: public class MyContainer<T> { private T[] _store; private int _size; ... } 尽管引用MyContainer的变量必须使用short和Integer等原始包装类声明,并且MyContainer的实例必须使用这些包装类创建,但使用short和int类型的数组是否可以节省内存 在我的搜索中,我发现Java编译

我在谷歌上搜索了一下,但我无法找到这个问题的决定性答案。为了澄清,请考虑这样的类:

public class MyContainer<T> {
    private T[] _store;
    private int _size;
    ...
}
尽管引用MyContainer的变量必须使用short和Integer等原始包装类声明,并且MyContainer的实例必须使用这些包装类创建,但使用short和int类型的数组是否可以节省内存

在我的搜索中,我发现Java编译器适用于泛型,但我不太确定现在是否可以假设Java没有针对泛型数组的某种优化


有人有证据支持或反对这一点吗?提前感谢。

泛型本身不提供任何内存节省,Integer/Short比原语等效值大

但是,使用Integer.valueOf int或Short.valueOf Short,或只是简单的自动装箱,将对常见的小正数和负数重复使用共享实例。这样可以通过单独实例化每个值来节省内存

见:

泛型是一种对象引用类型,因此往往比基元int或short数组大/慢一些。与其他列表相比,Java对诸如List之类的通用集合不应用空间或时间优化,因为JVM在内部在所有列表实例之间共享相同的类和字节码。数组也是如此


不要担心内存或性能,除非这是在性能关键堆栈底部附近使用的核心代码。只有循环最深、使用最频繁和性能最受限制的代码段才应该是设计阶段优化的候选代码。

否。泛型与原语或内存节省无关

尽管引用MyContainer的变量必须使用short和Integer等原始包装类声明,并且MyContainer的实例必须使用这些包装类创建,但使用short和int类型的数组是否可以节省内存


仅在现有答案的基础上,可以使用支持基元数组实现通用集合接口,但不能通用。例如,的返回一个列表实现,该实现由int[]支持,并在其所有方法调用上简单地装箱/取消装箱。但是番石榴对每个原语都有单独的模式实现——没有办法像你希望的那样统一它。

另一种方法是使用

    TIntArrayList.wrap(int[] array)
来自Trove4j库,它将数组包装到的集合中,允许您节省内存并添加标准Java的ArrayList功能,如自动扩展、排序、选择、迭代等

为了符合Java集合列表,您可以使用decorator

    new TIntListDecorator(TIntList list)

这些都不重要。这是一个微观优化,不可能在实际代码中产生可测量的差异。duffymo是绝对正确的。除非通过广泛的测试最终确定它是某种瓶颈的来源,否则不要担心这一点。如果可以的话,不要使用Integer[]或Short[]。如果需要同时支持这两种类型,那么使用int[]要好得多。+1泛型可以改进编译时类型检查,而不是设计。Ie的设计目的是在运行时没有影响,以确保向后兼容。@PaulBellora谢谢,但他们从来没有这样做过。我只是把它当作是破坏网站。也许它被否决了,因为它是一个没有解释的模糊答案@彼得拉维的评论解释得足够透彻,没有必要要求进一步澄清。@blue_deref也许他们是这么想的:这是任何人的猜测。我对投机不感兴趣。但是“不”并没有什么“含糊”,下面的句子是一个解释。