java中的int或Integer [重复]
Posted
技术标签:
【中文标题】java中的int或Integer [重复]【英文标题】:int or Integer in java [duplicate] 【发布时间】:2020-11-08 09:02:17 【问题描述】:我在代码中多次看到人们使用int
或Integer
在bean 中声明变量。我知道int
是datatype
和Integer
是wrapper class
。
我的问题是,在哪种情况下应该使用int
或Integer
,它们中的任何一个比另一个有什么优势?
【问题讨论】:
这能回答你的问题吗? 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,它们中的任何一个比另一个有什么优势?
好吧,您应该在必须时使用引用类型Integer
。 Integer
只不过是一个盒装的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<Integer>
而不是 List<int>
的原因,因为后者不是合法的 Java 代码(但是 - 给它几个版本,然后它很可能是合法的,请参阅 Project Valhalla)。
还要注意,编译器会在此处默默地转换您的 v;如果您查看编译后的代码,就好像 javac 在这里编译了indices.add(Integer.valueOf(v))
。但这很好,让编译器做它的事情。通常,编译器发出的内容和热点优化的内容是一致的;相信在这种情况下,javac 发出的内容会相对有效。
【讨论】:
【参考方案3】:int
是原始类型,value type
用于数字文字。
value type
,所以它存储在内存的Stack
区域,因此对它的操作要快得多;
无论何时需要,编译器都会隐式自动地从 int
到 Integer
来回转换(也称为装箱和拆箱),反之亦然;
Integer
是一个类,它是一个reference type
,并且你实例化了一个该类型的对象。
Integer
的实例进行一些算术运算,在底层,它仍然是由int
原语实现的,它只是被包装到盒子/容器中;
它是一个引用类型/对象,这一点非常重要,你可以Serialize或Deserialize它;
它还有一些非常有用的实用工厂方法,例如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[] 的最快方法 [重复]