使用哪一个,int 还是 Integer

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

如果我将字段定义为 Integer,那么如果我要从 DB 检索超过2000条记录,是否会因为“ Integer”类型而影响性能?

先谢谢你。

58438 次浏览

Integer理论上比 int慢,但是性能影响应该是最小的,除非你正在处理数字。此外,JIT 优化将减少性能损失。

使用在基本类型或引用类型方面更适合您的情况的类型。

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

表现在这里没什么关系。

  • 如果您选择 int,您最终将添加额外的处理代码; 这将不会给您带来太多好处。您的代码将不会是干净和直接的,大量的固定代码,您甚至不会获得性能。
  • 让我把话说清楚,对于数据库,null 不等于0。有时,您最终进入 0,其中 null的目的。假设用户提交了一个表单,但是没有为 int提供任何值。默认情况下,您最终将获得 0。如果该字段在数据库中是 not null,那么它就有意义,或者说确实有意义。

我想这取决于您使用什么来访问数据库。对于普通的旧 JDBC,您可以使用 int,而 ORM 可以无声地将它们转换为 Integers。Integer 允许你处理 无效

你真的应该根据你需要你的对象做什么来做决定,而不是性能成本。一旦一个速度问题被分析器识别出来,就应该根据性能做出决定——这是所有罪恶的根源。

看看这两者的一些特性,然后用它们来做决定,例如。

  • Integer可以是 nullint不能。那么 DB中的 intNullable场吗?
  • 您需要访问 Integer类方法吗?
  • 你在做算术吗?

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

在我看来,要在整型和整型之间做出选择,最终取决于 null 对它来说是否是一个有效的值。自动装箱(和自动装箱)将处理任何转换问题,其中数字只是必须是一种或另一种类型。表现(正如已经指出的那样)也不太可能在几乎所有情况下都引人注目。

此外,int 应该是自然的选择,而且无论如何,如果存在这个问题,int 可能是性能最好的。如果您需要能够存储 null,那么 使用 Integer (并且还要确保对于接受简单 int 的方法,没有 null 引用被自动取消装箱,因为这将导致 NullPointerException)。

为了给您一个概念,2000 Integer 将向您的查询添加大约0.5 ms。如果您必须序列化这些数据,那么它可以添加更多的内容。

然而,正确性应该放在第一位。没有必要非常快,但错了。您必须考虑空值以及如何处理它们。(除非列是 NOT NULL)您可以使用 Integer.MIN _ _ VALUE,或者您可以使用 很长字段代替 int,并使用 Long.MIN _ VALUE 表示 NULL。即使它比 int 大,它仍然比 Integer 小很多倍,效率也更高。

整型比整型快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

使用 toString(String)不能将 int转换为 String

Integer可以通过 toString(String)转换成 String,也可以处理 null

在大多数计算中,Java 都使用 int。除了基元数组之外,Integer用于所有形式的集合。

使用大量的临时 Integers,并在后台使用不可分析的 CPU,这会导致所有事情都变慢。每秒钟有太多的临时设备被丢弃会导致 CG 进入紧急“我现在需要内存”模式,这会导致延迟关键应用程序(即: 实时交互式图形、物理设备控制器或通信)的停滞

因此,对我来说,如果我有很多嵌套调用,不做数学,但访问很多集合,如使用关键字的映射,我使用整数,以避免吨自动装箱时,参数传递。

如果操作是数学密集型的,或者用作循环计数器或其他面向数学的操作,并且不存储在集合中(基元数组除外) ,则使用基元。除了 String 是一个完整的对象之外,其他所有原语也是如此。

如果你想检查一个 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");
}
}
}

需要考虑的一种情况是验证。

想象一下,我们有以下这些类:

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

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

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