71

我需要创建一个数据传输对象,用于存储从数据库中检索到的记录。在这个数据传输对象中,我需要声明一个数字字段。对于哪个更好 - intInteger

如果我将字段定义为整数,如果我要从数据库中检索超过 2000 条记录,是否会因为“整数”类型而对性能产生任何影响!?

提前致谢。

4

11 回答 11

141

Integer是更好的选择,因为它可以处理null;对于int,null会变成0, 默默地,如果resultSet.getInt(..)使用的话。否则,它可能会抛出一些异常,例如“无法设置null为原始属性”。

性能在这里无关紧要。

  • 如果您选择int,您最终将添加额外的处理代码;这对你没有多大好处。你的代码不会干净直接,大量的样板代码,你甚至不会获得性能。
  • 让我说清楚,对于数据库,null 与零不同。有时您最终会进入预期的0位置。null想象一下用户提交了一个表单,但没有为int. 默认情况下,您最终会得到0not null当该字段在数据库中时,这是有意义的,或者确实如此。
于 2009-01-08T09:44:03.847 回答
23

你真的应该根据你需要你的对象做什么而不是性能成本来做出决定。一旦使用分析器确定了速度问题,就应该根据性能做出决定——这是万恶之源。

查看两者的一些功能并将其用于您的决定,例如

  • Integer可以nullint不能。那么int数据库中是一个Nullable字段吗?
  • 您需要访问Integer类方法吗?
  • 你在做算术吗?

就个人而言,我总是选择原语而不是包装器。但这只是一种偏好,而不是基于任何技术优点。

于 2009-01-08T09:54:36.150 回答
12

在我看来,将某物声明为 int 或 Integer 之间的选择只是归结为 null 是否是它的有效值。自动装箱(和自动拆箱)将处理数字必须是一种或另一种类型的任何转换问题。在几乎所有情况下,性能(正如已经指出的)也不太可能引人注目。

此外, int 应该是自然的选择,如果这是一个问题,它可能是性能最高的。如果您需要能够存储空值,那么您必须使用 Integer(并且还要确保对于仅采用整数的方法不会自动取消装箱空引用,因为这将导致 NullPointerException)。

于 2009-01-08T10:54:00.180 回答
5

Integer理论上比 慢int,但是除非您处理数字,否则性能影响应该是最小的。JIT 优化也将减少性能损失。

在原始类型或引用类型方面使用更适合您的情况的一种。

于 2009-01-08T09:43:31.760 回答
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());

结果:
test:objects 10.184
test:primitives 1.151

于 2010-11-04T06:30:04.120 回答
2

为了给您一个想法,2000 Integer 会为您的查询增加大约 0.5 毫秒。如果你必须序列化这些数据,它可能会增加很多。

但是,正确性应该是第一位的。速度很快但错误是没有意义的。您必须考虑空值以及如何处理它们。(除非该列不是 NULL)您可以使用 Integer.MIN___VALUE 或者您可以使用long字段而不是 int 并将 Long.MIN_VALUE 用于 null。即使它比 int 大,它仍然会比 Integer 小很多倍并且效率更高。

于 2009-03-30T06:04:13.360 回答
1

我想这取决于您用于访问数据库的内容。使用普通的旧 JDBC,您可以使用ints,而 ORM 可以静默地将它们转换为Integers无论如何。并且 Integer 将允许您处理nulls

于 2009-01-08T09:45:06.887 回答
1

int被java用于大多数计算。 Integer用于除原始数组之外的所有形式的集合。

使用大量临时整数来破坏垃圾收集器并在后台使用不可分析的 CPU,这将导致一切普遍放缓。每秒丢弃的临时对象过多会导致 CG 进入紧急“我现在需要内存”模式,这可能会导致延迟关键应用程序(即:实时交互式图形、物理设备控制器或通信)停止

所以对我来说,如果我有很多不做数学运算但访问很多集合的嵌套调用,例如使用映射的键,我使用 Integer 以避免在传递参数时大量自动装箱。

如果操作是数学密集型或用作循环计数器或其他面向数学的操作,并且未存储在集合中(原始数组除外),我使用原始。除了 String 之外的所有其他原语也是如此,它是一个成熟的对象。

于 2015-10-17T17:43:36.720 回答
0

int不能String使用toStringor强制转换为(String)

Integer可以String使用toStringor进行转换(String),并且可以处理null.

于 2012-11-28T11:56:41.633 回答
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");
        }
    }
}
于 2017-07-12T10:03:05.157 回答
0

要涵盖的一种情况是验证。

假设我们有以下类:

class Foo{
    @Min(value = 10)
    int val;
}

如果用户没有val在请求中提供值,我们会得到一个讨厌的NumberFormatException.

如果int替换为Integer,我们可以@NotNull更优雅地使用和解决这个问题。

于 2019-03-05T15:39:51.620 回答