一致使用基元和包裹的基元

时间:2015-07-21 08:18:09

标签: java performance casting wrapper semantics

如果我将int用于特定变量,但是必须使用它处理某种类型的集合,这意味着int将被转换为包装的int / int对象,反之亦然多次,这是有意义的在这种情况下,总是在性能方面和语义上更好地总是对这个变量使用Integer,所以为了避免int和Integer之间的常量转换(即当你将int添加到集合时,它必须被转换为Integer(实际上它必须是新创建的),当你从集合中获取它时,它必须被转换为int)?

2 个答案:

答案 0 :(得分:0)

为了保持一致,这里有两种可能性:

但是如果你在这里没有一个非常特殊的情况并且你跟踪了一些性能问题,那么铸造的性能影响可能在这里可以忽略不计。如果你真的不需要,你应该不要担心这种微观优化

使用Wrapper类并不总能带来好处。请考虑以下代码:

List<Integer> numbers, squares;
    //initialize both, fill numbers

    for(Integer number: numbers)
        squares.add(number*number);

    for(int i: numbers) {
        squares.add(i*i);
    }

在第一个循环中,你从集合中获取你的数字straigt而不进行强制转换,但是然后将它转换为int,与自身相乘,并在将其存储到正方形之前自动生成回整数。

在第二个循环中,在从列表中获取Integer时将其转换为int,将其与自身相乘,然后在存储之前将其自动放回到Integer中。

在这两种情况下,都涉及到自动装箱。要完全避免这种情况,您必须使用原始集合或int []。

答案 1 :(得分:0)

如果您担心自动装箱/自动装箱的效率,可以手动将原始类型转换为其包装类对象。 E.g。

ArrayList<Integer> list=new ArrayList<>();
for(int i=0;i<5;i++)
{
  list.add(Integer.valueOf(i));
}

根据Integer.valueOf()的API,此方法可能通过缓存频繁请求的值来显着提高空间和时间性能。