我需要创建一个数据传输对象,我将用它来存储从数据库中检索的记录。在这个数据传输对象中,我需要声明一个数字字段。对于哪一个更好 - int 或整数
如果我将字段定义为Integer,如果我要从DB检索超过2000条记录,是否会因“整数”类型而对性能产生影响!
提前致谢。
答案 0 :(得分:111)
Integer
是一个更好的选择,因为它可以处理null
;对于int
,如果使用null
,则0
会默默地resultSet.getInt(..)
。否则,它可能会抛出一些异常,例如“无法将null
设置为原始属性”。
这里的表现很少受到关注。
int
,则最终会添加额外的处理代码;这对你没什么好处。你的代码不会干净简洁,很多样板代码,你甚至都不会获得性能。0
,其中null
是预定的。想象一下用户提交表单的情况,并且不为int
提供任何值。默认情况下,您最终会获得0
。当该字段在数据库中为not null
时,它确实有意义,或者确实如此。答案 1 :(得分:18)
您应该根据您需要做的事情而不是性能成本做出决定。一旦确定速度问题与分析器 - 所有邪恶的根源以及所有这一切,就应该根据性能做出决定。
查看两者的一些功能并将其用于您的决定,例如
Integer
可以是null
,int
则不能。那么数据库 int
字段中的Nullable
是这样的吗?Integer
类方法?就个人而言,我总是选择包装器上的原语。但这只是一种偏好,而不是基于任何技术优点。
答案 2 :(得分:10)
在我看来,在声明int或Integer之间的选择只是归结为null是否为它的有效值。自动装箱(和自动装箱)将处理任何转换问题,其中数字必须是一种或另一种类型。在所有情况下,表现(如已经指出的)也不太可能是显而易见的。
此外,int应该是自然的选择,并且无论如何都可能是性能最高的。如果你需要能够存储空值,那么你有来使用Integer(并且还要确保没有空引用为一个只需要整数的方法自动取消装箱,因为这会导致NullPointerException)
答案 3 :(得分:5)
Integer
理论上比int
慢,但性能影响应该是最小的,除非您正在处理数字。 JIT优化也会降低性能损失。
在原始或参考类型方面使用最适合您情况的那个。
答案 4 :(得分:4)
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());
结果:
测试:对象10.184
测试:原语1.151
答案 5 :(得分:2)
为了给你一个想法,2000 Integer会为你的查询添加大约0.5毫秒。如果你必须序列化这些数据,它可以添加更多。
但是,应该首先提出正确性。没有必要非常快但是错误。您必须考虑空值以及如何处理它们。 (除非该列为非NULL)您可以使用Integer.MIN ___ VALUE,或者可以使用 long 字段而不是int,并将Long.MIN_VALUE用于null。即使它大于int,它仍然会比Integer小许多倍并且效率更高。
答案 6 :(得分:1)
我想这取决于您用于访问数据库的内容。使用普通的旧JDBC,您可以使用int
,而ORM无论如何都可以静默地将它们转换为Integers
。并且Integer允许您处理 nulls 。
答案 7 :(得分:1)
int。除原始数组外,整数用于所有形式的集合。
使用大量临时整数来破坏垃圾收集器,并在后台使用无法使用的CPU,这将导致一切速度普遍减慢。每秒被摧毁的太多临时工将导致CG进入紧急状态&#34;我现在需要记忆&#34;模式可能导致延迟关键应用程序中的停顿(即:实时交互式图形,物理设备控制器或通信)
所以对我来说,如果我有很多嵌套调用没有数学但是访问很多集合,比如使用地图键我使用Integer,以避免在传递参数时发生大量自动装箱。
如果操作是数学密集型的,或者用作循环计数器或其他面向数学的操作而不是存储在集合中(原始数组除外),我使用原语。除了作为完全成熟的对象的String之外的所有其他基元也是如此。
答案 8 :(得分:0)
int
或String
toString
无法投放到(String)
。
Integer
可以使用String
或toString
投放到(String)
,并且可以处理null
。
答案 9 :(得分:0)
如果要检查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");
}
}
}
答案 10 :(得分:0)
一种验证的方案是验证。
想象一下我们有以下课程:
class Foo{
@Min(value = 10)
int val;
}
如果用户未在请求中提供val
的值,我们将得到讨厌的NumberFormatException
。
如果将int
替换为Integer
,我们可以使用@NotNull
并更优雅地解决此问题。