【问题标题】:Consistent use of primitives and wrapped primitives原语和包装原语的一致使用
【发布时间】:2015-10-10 14:17:00
【问题描述】:

如果我将 int 用于特定变量,但必须用它处理某种集合,这意味着 int 将多次转换为包装的 int/int 对象,反之亦然,这是有道理的在这种情况下,始终将 Integer 用于此变量会在性能和语义上更好,因此要避免在 int 和 Integer 之间进行持续转换(即,当您将 int 添加到集合时,必须将其转换为 Integer (实际上它必须是新创建的),当你从集合中获取它时,它必须被强制转换为 int)?

【问题讨论】:

  • 这是一个问题吗?除了最后的问号?它看起来像一个声明
  • 如果是一个问题,一个小提示:有很多库为 Java 提供原始集合。

标签: java performance casting wrapper semantics


【解决方案1】:

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

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

根据Integer.valueOf()的API,这种方法通过缓存频繁请求的值可能会产生明显更好的空间和时间性能。

【讨论】:

    【解决方案2】:

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

    • 要么你一直使用包装类

    • 或者你使用原始集合(例如Commons Primitives

    但是,如果您在这里没有非常特殊的情况,并且您跟踪了一些性能问题到该转换,那么转换的性能影响在这里可能可以忽略不计。如果您真的不需要,您应该不必担心此类微优化


    使用 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);
        }
    

    在第一个循环中,您从集合中直接获取数字而不进行转换,但随后将其转换为 int,与自身相乘,然后自动装箱回 Integer,然后将其存储在正方形中。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2011-10-24
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多