通过方法实现Java自动装箱

通过方法实现Java自动装箱,java,autoboxing,unboxing,Java,Autoboxing,Unboxing,假设我有一门课: class A { private Integer i; public int getI() { return i; } // Setter, etc. } 我写道: A a = // initializer Integer b = a.getI(); 有多少个整数?我对自动装箱/取消装箱的天真解读让我相信答案是2,但如果getI()是: 那么答案将是1。正确 从理论上讲,编译器/JIT/JVM/etc可以优化自动装箱,但我不知道它是否真的可以

假设我有一门课:

class A {
  private Integer i;

  public int getI() {
    return i;
  }

  // Setter, etc.
}
我写道:

A a = // initializer

Integer b = a.getI();
有多少个整数?我对自动装箱/取消装箱的天真解读让我相信答案是2,但如果getI()是:

那么答案将是1。

正确

从理论上讲,编译器/JIT/JVM/etc可以优化自动装箱,但我不知道它是否真的可以

同样的整数对象也有可能被重复使用。例如,Integer.valueOf(2)保证在每次调用它并重新使用同一对象时,都会为您提供相同的Integer对象。这仅适用于-128到+127范围内的值,但可能发生在该范围之外,但不应依赖于此。

正确

从理论上讲,编译器/JIT/JVM/etc可以优化自动装箱,但我不知道它是否真的可以


同样的整数对象也有可能被重复使用。例如,Integer.valueOf(2)保证在每次调用它并重新使用同一对象时,都会为您提供相同的Integer对象。这仅适用于-128到+127范围内的值,但可能发生在该范围之外,但不应依赖于此。

您完全正确,但有一点需要注意:第一部分的答案取决于
整数i的值

  • 在第一个场景中,一个
    Integer
    在构造函数中创建,另一个是在装箱来自
    getI()的
    int
    时创建的
  • 在第二个场景中,不需要装箱,因此只有一个
    Integer
    对象

注意:如果
整数i
的值很小(更准确地说,介于-128和127之间,包括-128和127),自动装箱将生成相同的
整数

您完全正确,但有一点需要注意:第一部分的答案取决于
整数i
的值

  • 在第一个场景中,一个
    Integer
    在构造函数中创建,另一个是在装箱来自
    getI()的
    int
    时创建的
  • 在第二个场景中,不需要装箱,因此只有一个
    Integer
    对象

注意:如果
整数i
的值很小(更准确地说,在-128和127之间,包括-128和127),自动装箱将产生相同的
整数

实际上保证在-128和127之间(包括-128和127)。在接近尾声的时候,Java编译器没有进行太多的优化,因为这将减少JIT的好处。是的,我所说的编译器也是指即时编译,可能会更清楚@乔恩:很高兴知道-我知道这是通常的情况,但我不知道它是必需的。实际上它保证在-128和127之间。在接近尾声的时候,Java编译器没有进行太多的优化,因为这将减少JIT的好处。是的,我所说的编译器也是指即时编译,可能会更清楚@乔恩:很高兴知道-我知道这是通常的情况,但我不知道这是必需的。啊,也是实习!下面是一个小问题:使用第一种样式更安全吗?如果我使用第二种风格,然后再给b分配另一个任务,a.I会保持不变还是也会被更新?@joeblubaugh两种方式都是安全的:
java.lang.Integer
是不可变的,所以它不能“在背后”更新。啊,也是实习!下面是一个小问题:使用第一种样式更安全吗?如果我使用第二种样式,然后对b进行另一个赋值,a.I会保持不变还是会被更新?@joeblubaugh两种方式都是安全的:
java.lang.Integer
是不可变的,因此它不能“在背后”被更新。
public Integer getI();