Java整数类型常量声明 - 原语还是对象?

时间:2015-06-09 09:20:56

标签: java

在Java中,对象方式声明的int常量的好处是什么:

public final static Integer SOME_CONSTANT = Integer.valueOf(99);

而非经典

public final static int SOME_CONSTANT = 99;

我知道对象和基元之间的基本区别,也是自动装箱。但我在公司的代码中看到了这个声明,我想知道,将整数常量声明为对象有什么特别的原因吗?

9 个答案:

答案 0 :(得分:4)

这取决于您打算如何使用常量。如果您的API需要Integer,则使用int表单会因自动装箱而导致性能下降。

如果您只需要原语,Integer的拆箱不是很昂贵,但很容易避免。

另请注意

Integer SOME_CONSTANT = Integer.valueOf(99);

完全相同
Integer SOME_CONSTANT = 99;

*.valueOf()方法添加了API,为编译器提供了一种自动框原语的通用方法。

答案 1 :(得分:2)

通常,人们使用第二种方式来声明常量,即使用原始int的方式,而不是方框Integer

此规则的一个例外是当您将常量放在集合中时,并且常量超出了对象自动 interned 的数字范围。您的代码可以在这里和那里节省几个CPU周期,因此考虑使用常量Integer代替int是公平的。这样可以在将这些常量放入集合时节省自动装箱成本。

但是,一般来说,这是一个微优化:除非你将原始常量放在一个需要很长一段时间的紧密循环中的集合中,否则这两个声明的代码之间不会有性能差异。

答案 2 :(得分:2)

实际上,2之间存在一些差异。查看字节代码将显示该信息。

<强> public final static int SOME_CONSTANT = 99;

将是编译时常量。所以这个东西的价值将作为字节代码本身的一部分提供。

字节代码:

 public static final int SOME_CONSTANT;
   descriptor: I
   flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
   ConstantValue: int 99

<强> public final static Integer SOME_CONSTANT1 = Integer.valueOf(99);

虽然Integer类的实例是 immutable ,但它们不会变成编译时常量。它们作为类的静态初始化程序的一部分运行。

字节代码:

 public static final java.lang.Integer SOME_CONSTANT1;
    descriptor: Ljava/lang/Integer;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        99
         2: invokestatic  #14                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         5: putstatic     #20                 // Field SOME_CONSTANT1:Ljava/lang
/Integer;
         8: return
      LineNumberTable:
        line 4: 0
        line 5: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature

答案 3 :(得分:1)

整数常量可以为null,因此对于无效或尚未设置的字段,您不需要特殊值。但根据常数,这个事实并不是一个好的论点。

益处ob整数常量是它们具有方法,用于解析,还有更多,并且可以使用整数常量池。有关更多信息,请查看此帖子:Java Integer: Constant Pool

答案 4 :(得分:0)

来自JavaDoc类中valueOf - 方法的Integer

/**
 * Returns an {@code Integer} instance representing the specified
 * {@code int} value.  If a new {@code Integer} instance is not
 * required, this method should generally be used in preference to
 * the constructor {@link #Integer(int)}, as this method is likely
 * to yield significantly better space and time performance by
 * caching frequently requested values.
 *
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 *
 * @param  i an {@code int} value.
 * @return an {@code Integer} instance representing {@code i}.
 * @since  1.5
 */

因此,当int的值为[-128,127]时似乎有点增益,但在我看来,由于计算机的高性能,这在大多数情况下是可以忽略的。如果你有一个非常非常非常关键的性能应用程序,你可以从使用它获得,否则我会选择提供最佳可读性的东西(在我看来是自动装箱。)

如果自动装箱使用valueOf - 方法,因为它在另一个答案中被说出来,那么当然没有区别,上面的比较将是Integer.valueOf vs {{ 1}}。

答案 5 :(得分:0)

Java是一种面向对象的语言...... 有许多任务可以在对象上执行,但不能在原始数据类型上执行...

例如,集合只能存储对象......

你应该看到你公司的下一个代码可能他们会将该常量用作某个对象,或者可能是为了将来使用它们会将其声明为对象......

答案 6 :(得分:-1)

由于int是一个原语,因此与Integer对象不同,它不能在其上调用任何方法。

答案 7 :(得分:-2)

如果您想使用SOME_CONSTANT执行某些操作,那么我认为将其声明为int会更好。

答案 8 :(得分:-4)

Integer类提供了一些有用的方法。 有关API的更多信息:Integer Reference

希望得到这个帮助。