java 中的整数或整数
int or Integer in java
我在代码中多次看到人们使用 int
或 Integer
在 bean 中声明变量。我知道 int
是 datatype
而 Integer
是 wrapper class
。
我的问题是,在什么情况下应该使用 int
或 Integer
,它们中的任何一个相对于另一个有什么优势吗?
你经常使用 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 代码(但是 - 给它几个版本,然后它很可能是合法的,请参阅 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
区域,因此对它的操作要快得多;
- 只要需要,编译器就会隐式自动地从
int
到 Integer
来回转换(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?
嗯,只要必须,就应该使用引用类型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
我在代码中多次看到人们使用 int
或 Integer
在 bean 中声明变量。我知道 int
是 datatype
而 Integer
是 wrapper class
。
我的问题是,在什么情况下应该使用 int
或 Integer
,它们中的任何一个相对于另一个有什么优势吗?
你经常使用 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 代码(但是 - 给它几个版本,然后它很可能是合法的,请参阅 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
区域,因此对它的操作要快得多; - 只要需要,编译器就会隐式自动地从
int
到Integer
来回转换(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?
嗯,只要必须,就应该使用引用类型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