java 中的整数或整数

int or Integer in java

我在代码中多次看到人们使用 intInteger 在 bean 中声明变量。我知道 intdatatypeIntegerwrapper class。 我的问题是,在什么情况下应该使用 intInteger,它们中的任何一个相对于另一个有什么优势吗?

你经常使用 int,几乎。

Integer 应该很少使用;它是编译器为您处理的中间类型。 Integer 可能出现的地方是泛型,因为 int 在那里根本不合法。这是一个例子:

List<Integer> indices = new ArrayList<Integer>();
int v = 10;
indices.add(v);

上面的工作:它编译没有错误,并且按照您的想法进行(它将“10”添加到整数值列表)。

请注意 vint 类型,而不是 Integer。这是正确的用法;您可以在此处编写 Integer,代码也能正常工作,但它不会特别地道 java。 Integer 相对于 int 没有优势,只有劣势;唯一一次你会使用它,如果 int 是直接非法的。这就是我写 List<Integer> 而不是 List<int> 的原因,因为后者不是合法的 java 代码(但是 - 给它几个版本,然后它很可能是合法的,请参阅 Valhalla 项目)。

另请注意,编译器正在此处默默地转换您的 v;如果您查看编译后的代码,就好像 javac 在这里编译了 indices.add(Integer.valueOf(v))。但这很好,让编译器做它的事情。通常,编译器发出的内容和热点优化的内容是一致的;相信 javac 发出的东西在这种情况下会相对有效。

int 是原始类型,Integer 是对象。 从内存占用的角度来看,基元比对象消耗更少的内存,而且基元是不可变的(因为它们使用按值传递)。 这是一篇关于何时使用 what 的好文章: https://www.baeldung.com/java-primitives-vs-objects

int 是原始类型,value type 用于数字文字。

  • 无论何时何地,只要你想做一些基本的算术运算就可以使用它;
  • 它是一个value type,所以它存储在内存的Stack区域,因此对它的操作要快得多;
  • 只要需要,编译器就会隐式自动地从 intInteger 来回转换(a.k.a 装箱和拆箱),反之亦然;

Integer 是一个 Class,它是一个 reference type 并且您实例化了该类型的对象。

  • 你创建了那个class的一个对象,这意味着你也有一些对该对象的方法和操作;
  • 任何时候你对 Integer 的实例做一些算术运算,在引擎盖下,它仍然由 int 原语实现,它只是包装到 box/container;
  • 它是一个引用类型/对象,这一点很重要,因为你可以序列化或者反序列化它;
  • 它还有一些非常有用的实用工厂方法,例如 Integer.valueOf(..) 将字符串解析为整数;
  • 它可以很好地用于泛型类型的声明,并且作为 class,它也支持层次结构。例如,它扩展了 Number,您可以利用它;
  • 存储在内存的Heap区域

My question is, in which condition int or Integer should be used and is there any advantage of either of them over another?

嗯,只要必须,就应该使用引用类型IntegerInteger 无非是一个盒装 int。具有包含指定 int 值的单个字段的对象。

考虑这个例子

public class Ex {
    int field1;
    Integer field2;

    public Ex(){}
}

在这种情况下,field1 将被初始化为值 0,而 field2 将被初始化为 null。根据字段代表的内容,这两种方法都可能是有利的。如果 field1 表示某种 UUID,您是否希望将其初始化为零值?

我不会太担心自动装箱的性能影响。在 获得代码 运行.

后,您仍然可以优化

有关详细信息,请查看文档

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html