我从一个函数生成一个大型数组(大小> 1000),其中包含int
类型的元素。我需要将此数组传递给泛型类型数组,但由于泛型类型数组不接受基本类型的数组,我无法这样做。
我担心使用 Integer
类型数组,因为在创建,性能,使用的空间(12字节对象的数组)方面,这样做会很昂贵大尺寸阵列。当我需要对数组元素执行一些额外操作时,它会创建不可变的 Integer
。
最好的方式是什么?
编辑为了消除一些混淆,我需要将int []传递给签名类型的方法:void setKeys(K... keys)
。
答案 0 :(得分:3)
如果您的阵列大约为1000(或甚至10,000或100,000)元素,则内存和性能方面的成本差异可能不会明显,除非您每次处理数组数千次。使用Integer编写代码,如果遇到性能问题,请稍后进行优化。
答案 1 :(得分:3)
我想将
int[]
传递给此函数:public Query<K> setKeys(K... keys);
我认为你的意思是int[]
应该是一组键...而不仅仅是一个键。
这是不可能的。泛型类型的类型参数必须是引用类型。您的用例需要K
为int
。
您有两种选择:
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>
支持数组。这些值在访问时会被装箱,所以只有在没有多次访问这些值时才有意义。