使用哪一个,int或Integer

我需要创build一个数据传输对象,我将使用它来存储从数据库检索的logging。 在这个数据传输对象中,我需要声明一个数字字段。 对于哪一个更好 – intInteger

如果我将字段定义为整型,那么如果我要从DB中检索超过2000条logging,将会因为“整型”types而对性能产生影响吗?

提前致谢。

Integer是一个更好的select,因为它可以处理null ; 对于int ,如果使用resultSet.getInt(..) ,则null将默认为0 。 否则,它可能会抛出一些exception,如“无法将null设置为原始属性”。

性能在这里没有什么关系。

  • 如果你selectint ,你将最终添加额外的处理代码; 那不会使你受益。 你的代码不会干净而直接,大量的锅炉代码,你甚至不会获得性能。
  • 让我说清楚,对于数据库来说,null与零不相同。 有时你最终input0 ,其中null是打算。 想象一下用户提交表单的情况,并且不提供int任何值。 你将最终得到0默认情况下。 这是合理的,或者确实如此,当该字段not null在数据库中为not null

你应该根据自己需要做的事情做出决定,而不是性能成本。 一旦一个速度问题已经与一个探查者 – 一切邪恶的根源和所有这一切确定,就应该根据性能来决定。

看看两者的一些特点,并将其用于你的决定,例如

  • Integer可以为nullint不可以。 那么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) toStringString ,它可以处理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"); } } }