使用哪一个,int或Integer

时间:2009-01-08 09:38:50

标签: java database performance types primitive

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

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

提前致谢。

11 个答案:

答案 0 :(得分:111)

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

这里的表现很少受到关注。

  • 如果您选择int,则最终会添加额外的处理代码;这对你没什么好处。你的代码不会干净简洁,很多样板代码,你甚至都不会获得性能。
  • 让我说清楚,对于数据库,null与零不同。有时您最终会输入0,其中null是预定的。想象一下用户提交表单的情况,并且不为int提供任何值。默认情况下,您最终会获得0。当该字段在数据库中为not null时,它确实有意义,或者确实如此。

答案 1 :(得分:18)

您应该根据您需要做的事情而不是性能成本做出决定。一旦确定速度问题与分析器 - 所有邪恶的根源以及所有这一切,就应该根据性能做出决定。

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

  • Integer可以是nullint则不能。那么数据库 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)

对于大多数所有计算,java都使用

int。除原始数组外,整数用于所有形式的集合。

使用大量临时整数来破坏垃圾收集器,并在后台使用无法使用的CPU,这将导致一切速度普遍减慢。每秒被摧毁的太多临时工将导致CG进入紧急状态&#34;我现在需要记忆&#34;模式可能导致延迟关键应用程序中的停顿(即:实时交互式图形,物理设备控制器或通信)

所以对我来说,如果我有很多嵌套调用没有数学但是访问很多集合,比如使用地图键我使用Integer,以避免在传递参数时发生大量自动装箱。

如果操作是数学密集型的,或者用作循环计数器或其他面向数学的操作而不是存储在集合中(原始数组除外),我使用原语。除了作为完全成熟的对象的String之外的所有其他基元也是如此。

答案 8 :(得分:0)

使用intString

toString无法投放到(String)

Integer可以使用StringtoString投放到(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并更优雅地解决此问题。