java中的int或Integer [重复]

Posted

技术标签:

【中文标题】java中的int或Integer [重复]【英文标题】:int or Integer in java [duplicate] 【发布时间】:2020-11-08 09:02:17 【问题描述】:

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

【问题讨论】:

这能回答你的问题吗? What is the difference between an int and an Integer in Java and C#?。具体来说,从那里查看this answer。 我认为我们应该始终默认使用int,原始类型的成本低于对象。当您需要对象的功能时,请使用 Integer 对象。例如通过引用的函数参数或当您返回一个 int 并且您希望结果可以为 null 的情况下。 发帖前一定要彻底搜索 Stack Overflow。 【参考方案1】:

我的问题是,应该在哪种情况下使用 int 或 Integer,它们中的任何一个比另一个有什么优势?

好吧,您应该在必须时使用引用类型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

【讨论】:

【参考方案2】:

你几乎总是使用int

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

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

上面的方法有效:它编译时没有错误,并且按照你的想法去做(它将'10'添加到整数值列表中)。

注意v 的类型是int,而不是Integer。这是正确的用法;你可以在这里写Integer 并且代码也可以工作,但它不会是特别惯用的java。 Integer 与 int 相比没有优势,只有劣势;您唯一使用它的时间是int 是否直接非法。这就是为什么我写 List&lt;Integer&gt; 而不是 List&lt;int&gt; 的原因,因为后者不是合法的 Java 代码(但是 - 给它几个版本,然后它很可能是合法的,请参阅 Project Valhalla)。

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

【讨论】:

【参考方案3】:

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

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

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

您创建了该类的一个对象,这意味着您对该对象也有一些方法和操作; 任何时候你对Integer的实例进行一些算术运算,在底层,它仍然是由int原语实现的,它只是被包装到盒子/容器中; 它是一个引用类型/对象,这一点非常重要,你可以SerializeDeserialize它; 它还有一些非常有用的实用工厂方法,例如Integer.valueOf(..),将字符串解析为整数; 它可以很好地用于泛型类型的声明,并且作为一个类,它也支持层次结构。比如它扩展了Number,你可以利用它; 它存储在内存的Heap 区域中。

【讨论】:

【参考方案4】:

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

【讨论】:

嗯,Integer 对象也是不可变的。 按值传递并不意味着不变。 Java 总是按值传递。如果你给它分配了一些不同的值,你不会创建一个新的int 并将前一个保留在内存中,直到 GC 收集它。

以上是关于java中的int或Integer [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中怎么将Long类型转换成Integer或int类型?

我如何在 java [重复] 中从 int[] 转换为 List<Integer>

在java Web项目中 数据库中的主键类型integer类型那么实体类中应该用啥类型或最好用啥类型?为啥?

将 ArrayList<Integer> 转换为 int[] 的最快方法 [重复]

Integer类toString(int i,int radix)方法

java中Object转换成int或String类型方法