【问题标题】:Why can't primitive data types be "null" in Java?为什么原始数据类型在 Java 中不能为“null”?
【发布时间】:2012-06-18 07:45:15
【问题描述】:

当声明任何原始类型数据时,如int 或double,它们会被初始化为0 或0.0。为什么我们不能将它们设置为null?

【问题讨论】:

    标签: java null primitive-types


    【解决方案1】:

    因为 Java 中的原始数据类型不是 Objects。您始终可以使用其中一个包装类来获得Object。八种原始数据类型中的每一种都有其对应的包装器:

    • 字节:java.lang.Byte
    • 短:java.lang.Short
    • int:java.lang.Integer
    • 长:java.lang.Long
    • 浮动:java.lang.Float
    • 双倍:java.lang.Double
    • 布尔值:java.lang.Boolean
    • 字符java.lang.Character

    如果您对整个结构感兴趣,可以开始here (Primitive Data Types)。

    【讨论】:

      【解决方案2】:

      对象比原语涉及更多的开销。以下测试显示 int 的执行速度比 Integer 快约 10 倍。

      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());
      

      这就是 .net 实现可空原语的原因,不幸的是 java 没有可空原语。

      【讨论】:

      • 这正是问题的原因。 .NET 很久以前就实现了,不幸的是,Java 在这方面落后了。
      【解决方案3】:

      首先,Primitive 和 Object Reference 的区别在于 Primitive 变量存储的是实际值,而对象引用变量存储了它们所引用的对象的地址,在这种情况下,在对象引用中,如果没有地址,它将传递给“null”。

      原始数据类型的默认值取决于原始数据类型:like byte = 0, short = 0, int = 0, long = 0L, float = 0.0f, double = 0.0d, boolean = false, char = " \u0000”。

      当我们声明任何类类型的变量时,它被称为引用数据类型。

      前:

      测试 t1

      测试 t2

      (对象包装类型)

      整数 i

      长长的

      对象引用默认值,Jvm将引用变量初始化为“null”,也会将数组初始化为“null”

      【讨论】:

        【解决方案4】:

        除了以上所有答案,我也想补充一点。

        对于原始类型,我们有固定的内存大小,即对于 int 我们有 4 个字节,对于 char 我们有 2 个字节。 null 仅用于对象,因为内存大小不固定。

        所以默认情况下我们有,

           int a=0;
        

        而不是

           int a=null;
        

        与其他原始类型相同,因此 null 仅用于对象而不用于原始类型。

        【讨论】:

          【解决方案5】:

          因为 null 是一个引用。原始类型不是引用类型。只有对象是引用类型。

          【讨论】:

            【解决方案6】:

            因为它是原始类型而不是对象。 如果您需要能够使用空值(即 Double 表示双精度、Long 表示长整数、Boolean 表示布尔值等),您可以为每种类型使用相应的对象

            【讨论】:

              【解决方案7】:

              原始类型只是数据。另一方面,我们所说的对象只是指向数据存储位置的指针。例如:

              Integer object = new Integer(3);
              int number = 3;
              

              在这种情况下,object 只是一个指向 Integer 对象的指针,它的值恰好是 3。也就是说,在存储变量对象的内存位置,你所拥有的只是对数据真正位置的引用是。而存储number的内存位置则直接包含值3。

              因此,您可以将object 设置为null,但这只是意味着该对象的数据为null(即未分配)。您不能将 int 设置为 null,因为语言会将其解释为值 0。

              希望有帮助!

              【讨论】:

              • 我想这些最佳实践仍然适用,即使 Java 8 引入了 OptionalInt 等可选原语? OptionalInt.empty() 可以用来代替空值。但我的理解是 Optionals 应该是方法的返回类型,而不是属性本身的类型。
              【解决方案8】:

              因为这是语言标准所说的。

              如果你想能够通过null,你应该使用the wrapper types,例如Integer 而不是 int。

              【讨论】:

                猜你喜欢
                • 2010-11-01
                • 2013-10-30
                • 1970-01-01
                • 2013-01-06
                • 1970-01-01
                • 2021-07-06
                • 2014-01-26
                • 2012-05-20
                相关资源
                最近更新 更多