使用哪一个,int或Integer
我需要创build一个数据传输对象,我将使用它来存储从数据库检索的logging。 在这个数据传输对象中,我需要声明一个数字字段。 对于哪一个更好 – int或Integer
如果我将字段定义为整型,那么如果我要从DB中检索超过2000条logging,将会因为“整型”types而对性能产生影响吗?
提前致谢。
Integer
是一个更好的select,因为它可以处理null
; 对于int
,如果使用resultSet.getInt(..)
,则null
将默认为0
。 否则,它可能会抛出一些exception,如“无法将null
设置为原始属性”。
性能在这里没有什么关系。
- 如果你select
int
,你将最终添加额外的处理代码; 那不会使你受益。 你的代码不会干净而直接,大量的锅炉代码,你甚至不会获得性能。 - 让我说清楚,对于数据库来说,null与零不相同。 有时你最终input
0
,其中null
是打算。 想象一下用户提交表单的情况,并且不提供int
任何值。 你将最终得到0
默认情况下。 这是合理的,或者确实如此,当该字段not null
在数据库中为not null
。
你应该根据自己需要做的事情做出决定,而不是性能成本。 一旦一个速度问题已经与一个探查者 – 一切邪恶的根源和所有这一切确定,就应该根据性能来决定。
看看两者的一些特点,并将其用于你的决定,例如
-
Integer
可以为null
,int
不可以。 那么DB中的int
是一个Nullable
字段? - 你需要访问
Integer
类的方法吗? - 你在做算术吗?
就我个人而言,我总是select包装的原始。 但这只是一个偏好的事情,而不是基于任何技术上的优点。
在我看来,声明int或Integer之间的select简单地归结为null是否是一个有效的值。 自动装箱(和autounboxing)将照顾任何转换问题,其中数字只是一种或另一种types。 绩效(正如已经指出的)在几乎所有情况下都不太可能被公之于众。
此外,int应该是自然的select,而且无论如何都应该是最高性能的。 如果你需要能够存储空值,那么你必须使用Integer(并且确保没有空引用是自动拆箱的方法,只需要一个简单的整数,因为这将导致NullPointerException)。
Integer
在理论上比int
要慢,但是性能的影响应该是最小的,除非你正在处理数字。 另外JIT优化将减less性能损失。
根据原始types或引用types使用更适合您的情况。
int比整数快10倍
我们用jetm性能库来testing这个代码
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());
结果是:
testing:对象10.184
testing:原语1.151
为了给你一个想法,2000 Integer会为你添加大约0.5毫秒的查询。 如果你必须序列化这些数据,它可能会增加更多。
但是,正确性应该是第一位的。 没有一点是非常快但错误的。 你必须考虑空值和你如何处理它们。 (除非列不为空)你可以使用Integer.MIN ___VALUE,或者你可以使用长字段而不是int,并使用Long.MIN_VALUE作为null。 尽pipe它大于int,但仍然比Integer小很多,效率也高。
我想这取决于你用什么来访问数据库。 用普通的JDBC可以用int
来完成,而ORM可以静静地将它们转换为Integers
。 整数将允许你处理空值 。
int被大多数所有的计算都由java使用。 整数用于所有forms的集合,除了原始数组。
使用大量的临时整数甩垃圾收集器,并在后台使用不可修改的CPU,这将导致一切的一般放缓。 每秒被丢弃的临时对象数量太多会导致CG进入紧急状态“我现在需要内存”模式,这会导致延迟关键应用程序(即:实时交互式graphics,物理设备控制器或通信)
所以对于我来说,如果我有很多不做math的嵌套调用,但访问了很多集合,比如使用映射键,我使用Integer来避免在传递参数时使用大量的自动装箱。
如果操作是math密集型的,或者用作循环计数器或其他math操作的操作,而不是存储在集合中(基本数组除外),我使用原语。 除了完整的对象的String之外的所有其他基元也是如此。
int
不能使用toString
或(String)
。
Integer
可以使用toString
或(String)
toString
为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"); } } }