【问题标题】:Which one to use, int or Integer使用哪一个,int 或 Integer
【发布时间】:2010-09-30 05:41:38
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 您很可能会发现,将数据从数据库移动到程序的物理开销超过了整数包装器的性能影响。

标签: java database performance types primitive


【解决方案1】:

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

这里的性能无关紧要。

  • 如果你选择int,你最终会添加额外的处理代码;这对你没有多大好处。您的代码不会干净直接,大量样板代码,甚至不会获得性能。
  • 让我明确一点,对于数据库,null 与零不同。有时您最终会输入0,而null 是该输入的。想象一下用户提交了一个表单,但没有为int 提供任何值的情况。默认情况下,您最终会得到0。当该字段在数据库中为 not null 时,这是有意义的,或者确实如此。

【讨论】:

【解决方案2】:

您确实应该根据您需要对象执行的操作而不是性能成本来做出决定。一旦使用分析器识别出速度问题(万恶之源),就应该根据性能做出决定。

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

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

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

【讨论】:

  • 自动装箱会处理它,如果它恰好是一次。否则,请在执行任何繁重的计算之前进行转换。
  • 是的,但是如果您要进行多次计算,则可能需要使用 int 选项来避免多次转换
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      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

      【讨论】:

      • int 快很多倍,但是即使在您的示例中,您也进行了一百万次迭代以查看差异。仅尝试 2000 个值,因为 OP 将使用。此外,您应该首先测试您认为最快的选项,以避免未预热的 JVM 创建任何基础。
      • 2000 个项目或从 Integer 到 int 的测试将得到相同的结果。 int 比 Integer 快。请记住,Integer 是一个类,上面的代码可以用 C++ 翻译成这样: for(n = 0; n privateJVMSetValue(10); t->privateJVMSetValue(11);对象当然可以为 null。如果你需要它,确实 int 不是你想要使用的。
      • 这个基准测试是小而原始的方式来显示任何东西。不是它意味着什么,但以下是我添加热身回合后得到的时间:Integer Loop: 0.0018 s, Int Loop: 0.0020 s。循环中发生的大部分事情可能都会被优化掉。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

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

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

          【讨论】:

            【解决方案9】:

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

            Integer 可以使用toString(String) 转换为String,它可以处理null

            【讨论】:

            • 您可以使用String.valueOf(int)int“转换”为String。正如@Adeel 回答指出的那样,能够处理“null”是这里唯一的优势。
            • 我不确定您使用的是什么时髦的编译器,但您永远无法整数转换为字符串。
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              要涵盖的一个场景是验证。

              假设我们有以下类:

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-07-05
                • 2012-05-24
                • 1970-01-01
                • 1970-01-01
                • 2020-11-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多