我需要创建一个数据传输对象,用于存储从数据库中检索到的记录。在这个数据传输对象中,我需要声明一个数字字段。对于哪个更好 - int或Integer
如果我将字段定义为整数,如果我要从数据库中检索超过 2000 条记录,是否会因为“整数”类型而对性能产生任何影响!?
提前致谢。
我需要创建一个数据传输对象,用于存储从数据库中检索到的记录。在这个数据传输对象中,我需要声明一个数字字段。对于哪个更好 - int或Integer
如果我将字段定义为整数,如果我要从数据库中检索超过 2000 条记录,是否会因为“整数”类型而对性能产生任何影响!?
提前致谢。
Integer
是更好的选择,因为它可以处理null
;对于int
,null
会变成0
, 默默地,如果resultSet.getInt(..)
使用的话。否则,它可能会抛出一些异常,例如“无法设置null
为原始属性”。
性能在这里无关紧要。
int
,您最终将添加额外的处理代码;这对你没有多大好处。你的代码不会干净直接,大量的样板代码,你甚至不会获得性能。0
位置。null
想象一下用户提交了一个表单,但没有为int
. 默认情况下,您最终会得到0
。not null
当该字段在数据库中时,这是有意义的,或者确实如此。你真的应该根据你需要你的对象做什么而不是性能成本来做出决定。一旦使用分析器确定了速度问题,就应该根据性能做出决定——这是万恶之源。
查看两者的一些功能并将其用于您的决定,例如
Integer
可以null
,int
不能。那么int
在数据库中是一个Nullable
字段吗?Integer
类方法吗?就个人而言,我总是选择原语而不是包装器。但这只是一种偏好,而不是基于任何技术优点。
在我看来,将某物声明为 int 或 Integer 之间的选择只是归结为 null 是否是它的有效值。自动装箱(和自动拆箱)将处理数字必须是一种或另一种类型的任何转换问题。在几乎所有情况下,性能(正如已经指出的)也不太可能引人注目。
此外, int 应该是自然的选择,如果这是一个问题,它可能是性能最高的。如果您需要能够存储空值,那么您必须使用 Integer(并且还要确保对于仅采用整数的方法不会自动取消装箱空引用,因为这将导致 NullPointerException)。
Integer
理论上比 慢int
,但是除非您处理数字,否则性能影响应该是最小的。JIT 优化也将减少性能损失。
在原始类型或引用类型方面使用更适合您的情况的一种。
int 比整数快 10 倍
我们使用 jetm 性能库测试此代码
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
结果:
test:objects 10.184
test:primitives 1.151
为了给您一个想法,2000 Integer 会为您的查询增加大约 0.5 毫秒。如果你必须序列化这些数据,它可能会增加很多。
但是,正确性应该是第一位的。速度很快但错误是没有意义的。您必须考虑空值以及如何处理它们。(除非该列不是 NULL)您可以使用 Integer.MIN___VALUE 或者您可以使用long字段而不是 int 并将 Long.MIN_VALUE 用于 null。即使它比 int 大,它仍然会比 Integer 小很多倍并且效率更高。
我想这取决于您用于访问数据库的内容。使用普通的旧 JDBC,您可以使用int
s,而 ORM 可以静默地将它们转换为Integers
无论如何。并且 Integer 将允许您处理nulls。
int
被java用于大多数计算。 Integer
用于除原始数组之外的所有形式的集合。
使用大量临时整数来破坏垃圾收集器并在后台使用不可分析的 CPU,这将导致一切普遍放缓。每秒丢弃的临时对象过多会导致 CG 进入紧急“我现在需要内存”模式,这可能会导致延迟关键应用程序(即:实时交互式图形、物理设备控制器或通信)停止
所以对我来说,如果我有很多不做数学运算但访问很多集合的嵌套调用,例如使用映射的键,我使用 Integer 以避免在传递参数时大量自动装箱。
如果操作是数学密集型或用作循环计数器或其他面向数学的操作,并且未存储在集合中(原始数组除外),我使用原始。除了 String 之外的所有其他原语也是如此,它是一个成熟的对象。
int
不能String
使用toString
or强制转换为(String)
。
Integer
可以String
使用toString
or进行转换(String)
,并且可以处理null
.
如果你想检查一个null
值,那么Integer
最好,但如果你想比较整数,那么 int 可能会更好。在下面的示例中,我使用整数 c= 1000 和 d= 1000 并比较它返回 false 但在 int 的情况下它们将返回 true。
public class IntegerCompare {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
Integer c = 1000;
Integer d = 1000;
if (a == b) {
System.out.println("int Value Equals");
}
if (c == d) {
System.out.println("Integer value Equals");
} else {
System.out.println("Integer Value Not Equals");
}
}
}
要涵盖的一种情况是验证。
假设我们有以下类:
class Foo{
@Min(value = 10)
int val;
}
如果用户没有val
在请求中提供值,我们会得到一个讨厌的NumberFormatException
.
如果int
替换为Integer
,我们可以@NotNull
更优雅地使用和解决这个问题。