【问题标题】:Auto Boxing vs static numbers自动装箱与静态数字
【发布时间】:2011-08-01 09:13:08
【问题描述】:

使用Integer i = NumberUtils.INTEGER_ONE 代替Integer i = 1 是否有价值?我不知道自动装箱后面发生了什么。

谢谢

【问题讨论】:

  • 像许多优化一样,您应该先询问;写这个的最简单和最清晰的方法是什么?您需要Integer 还是int 更简单?
  • @PeterLawrey:是的,我需要一个整数,而您的“问题”正是我想问的。感谢您的澄清:-)
  • 我的回答是int i = 1; 是最简单、最清晰、最快的。

标签: java performance coding-style boxing


【解决方案1】:

基本上会编译成:

Integer i = Integer.valueOf(NumberUtils.INTEGER_ONE);

假设INTEGER_ONE 被声明为int

在执行时,假设 INTEGER_ONE 的值为 1,实际上每次都会返回对相同对象的引用,由 Java 语言规范保证,因为它在 -128 到 127 的范围内. 超出该范围的值可以返回对同一对象的引用,但不是必须的。

【讨论】:

    【解决方案2】:

    java 中的许多包装器和实用程序类都有缓存池。当调用 valueOf() 方法时,Integer 使用内部缓存的“Integer”引用的静态数组来抛出。字符串也有类似的池。

    但是,如果您执行 Integer i = 128 之类的操作,则将开始影响性能,因为自动装箱将对未缓存的整数起作用(并不是说它不会对缓存的整数起作用)。与返回缓存整数的情况不同,此语句创建一个新对象。创建对象的成本很高,并且会降低性能。

    [编辑]

    明确的答案

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 2012-04-28
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多