0

我做了一些谷歌搜索,但我一直无法找到这个问题的决定性答案。为了澄清起见,考虑这样的类:

public class MyContainer<T> {
    private T[] _store;
    private int _size;
    ...
}

是否有可能通过使用类型short为 vs.的数组来节省内存int,尽管MyContainer必须使用原始包装类(如Shortand )声明具有引用的变量,并且必须使用相同的包装器创建的Integer实例MyContainer上课?

在我的搜索中,我发现 Java 编译器将类型擦除应用于泛型,但我不太确定我现在可以假设 Java 没有对泛型类型数组进行某种优化。

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

4

4 回答 4

4

泛型本身不提供任何内存节省,并且 Integer/Short 大于原始等效项。

然而,使用 Integer.valueOf(int) 或 Short.valueOf(short),或者只是简单的自动装箱,将重新使用共享实例来处理常见的小正数和负数。这样可以节省内存而不是分别实例化每个值。

请参阅: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)

泛型是一种对象引用类型,因此往往比原始数组intshort. 与其他列表相比, Java 不会对通用集合应用空间或时间优化,因为在内部,JVM 在所有实例List<Integer>之间共享相同的类和字节码。List数组也是如此。

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

于 2013-09-20T01:13:46.130 回答
2

不,泛型与基元内存节省无关。

于 2013-09-20T01:17:57.430 回答
2

是否有可能通过使用类型short为 vs.的数组来节省内存int,尽管MyContainer必须使用原始包装类(如Shortand )声明具有引用的变量,并且必须使用相同的包装器创建的Integer实例MyContainer上课?

只是建立在现有答案的基础上,可以使用支持原始数组实现通用集合接口,但不是通用的。例如GuavaInts.asList(int...)返回一个List<Integer>由 an 支持的实现,并且int[]在其所有方法调用上简单地装箱/取消装箱。但是 Guava 对每个原语都有该模式的单独实现——没有办法像你希望的那样统一它。

于 2013-09-20T02:05:59.893 回答
2

另一种方法是使用

    TIntArrayList.wrap(int[] array)

Trove4j将您的数组包装到Trove的集合中的库中,您可以节省内存并添加标准 Java 的ArrayList功能,如自动扩展、排序、选择、迭代等。

为了遵守 Java 集合(列表),您使用装饰器

    new TIntListDecorator(TIntList list)
于 2013-09-23T12:33:27.527 回答