需要将大量'int'类型传递给通用数组&集合

时间:2011-03-18 04:09:37

标签: java arrays generics int primitive-types

我从一个函数生成一个大型数组(大小> 1000),其中包含int类型的元素。我需要将此数组传递给泛型类型数组,但由于泛型类型数组不接受基本类型的数组,我无法这样做。

我担心使用 Integer 类型数组,因为在创建,性能,使用的空间(12字节对象的数组)方面,这样做会很昂贵大尺寸阵列。当我需要对数组元素执行一些额外操作时,它会创建不可变的 Integer

最好的方式是什么?

编辑为了消除一些混淆,我需要将int []传递给签名类型的方法:void setKeys(K... keys)

5 个答案:

答案 0 :(得分:3)

如果您的阵列大约为1000(或甚至10,000或100,000)元素,则内存和性能方面的成本差异可能不会明显,除非您每次处理数组数千次。使用Integer编写代码,如果遇到性能问题,请稍后进行优化。

答案 1 :(得分:3)

  

我想将int[]传递给此函数:public Query<K> setKeys(K... keys);

我认为你的意思是int[]应该是一组键...而不仅仅是一个键。

这是不可能的。泛型类型的类型参数必须是引用类型。您的用例需要Kint

您有两种选择:

  • 使用Integer(或可变int持有者类)并支付效果惩罚,或
  • 放弃使用泛型并更改该方法的签名。

顺便说一句,Integer类为Integer个值保留int个对象的缓存。如果使用Integer.valueOf(int)创建对象,则很有可能获得对预先存在的对象的引用。 (当然,这只能起作用,因为Integer对象是不可变的。)

答案 2 :(得分:0)

如果 关注性能,您可以编写一个包含公共int的简单类,这意味着您可以根据需要进行调用并进行变更。话虽如此,我确实同意你要在做之前绝对确保你需要这个性能改进。

答案 3 :(得分:0)

如果你实际需要担心装箱/取消装箱整数的性能影响,你可以考虑GNU Trove,特别是他们的TIntArrayList。它允许您在原语支持的同时模仿ArrayList<Integer>的功能。那就是说,我不确定你是否需要这个,我不确定这正是你想要的。

答案 4 :(得分:0)

如果您不希望整数永久装箱,您可以从Google Collections库(http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/primitives/Ints.html#asList(int...))传入Ints.asList()的结果,该库将由List<Integer>支持数组。这些值在访问时会被装箱,所以只有在没有多次访问这些值时才有意义。