【问题标题】:Is there any difference between these two statements?这两种说法有区别吗?
【发布时间】:2010-11-03 18:39:03
【问题描述】:
  1. float ff = 1.2f;
  2. Float fo = new Float(1.2f);
  3. double fg = 3.2d;
  4. Double fh = new Double(2.1d);

我可以在 (1) 和 (3) 之间或 (2) 和 (4) 之间使用“=”吗?

【问题讨论】:

  • 如果我添加这两个语句==> 3) double fg = 3.2d; 4)双fh =新双(2.1d);我可以在 ((1) 和 (3)) 之间或 ((2) 和 (4)) 之间使用 '=' 吗?
  • @Neda,如果您尝试“ff = fg”,您将看到“可能丢失精度”消息,如果您尝试“fo = fh”,您将看到“不兼容的类型”。
  • @Neda,“fg = ff”也可以正常工作(浮点数适合双精度),但“fh = fo”仍然会给你一个“不兼容的类型”。
  • 亲爱的 Bob,你介意解释一下这个“fh=fo”吗,因为 fo 是 Fl​​oat 而 fh 是 Double!!!!我可以在 (2) 和 (4) 中使用 '==' 吗???
  • @Neda,“Double”和“Float”是非常不同的东西。他们使用与“double”和“float”相同的英文单词这一事实无关紧要。你可以做的是说 Double fh = fo.doubleValue() 并得到一个与浮点值非常相似的 Double。

标签: java types floating-point primitive


【解决方案1】:

是的,2 创建了一个对象。

【讨论】:

    【解决方案2】:

    是的。第一个声明了一个原始类型的变量float,并将其初始化为1.2。

    当第二个声明一个引用类型为Float 的变量时,创建一个Float 类型的对象,然后为该变量分配一个引用。

    【讨论】:

      【解决方案3】:

      是的。

      1. 创建一个普通的旧数据类型(AKA 原始类型),称为“float”。
      2. 创建一个名为 Float 的 Java 对象,其中包含恰好与 (1) 相同的值

      回答编辑问题:

      你会看到

      1. 如果您尝试ff = fg,则会出现“可能丢失精度”消息。
      2. “不兼容的类型”如果您尝试fo = fh
      3. fg = ff 可以正常工作(浮点数适合双精度)。
      4. fh = fo 仍然会给你一个“不兼容的类型”。

      【讨论】:

        【解决方案4】:

        是的,第一个是原始类型,第二个是包装原始浮点类型功能的装箱类,我们需要第二个,例如在集合中使用。在您不得不处理大量类型转换之前(我认为直到 Java 1.5),现在包装类的存在具有这些功能。更多信息。 here

        【讨论】:

        • 理解自动装箱是理解这一点的关键。如果你问得正确,Java 会自动从 Float 转换为 float 到 Double 到 Double。
        【解决方案5】:

        是的,原始类型不能为 NULL,对象可以。此外,Float 对象还附加了一堆有用的实用功能。

        【讨论】:

          【解决方案6】:

          new Float(1.2f) 每次都会创建一个 new Float 对象,消耗内存。

          如果您使用工厂方法Float.valueOf(1.2f) JVM 可能会重复使用现有的 Float 对象实例以获得相同的值。只有当还没有具有相同值的 Float 实例时,它才能创建一个新的对象实例。

          通常你会想要使用 Float.valueOf(1.2f) 而不是 new Float(1.2f)。

          另请注意,使用等于运算符 == 时基元和对象的工作方式不同。

          float x1 = 1.2f;
          float x2 = 1.2f;
          
          x1 == x2  // true
          
          Float f1 = new Float(1.2f);
          Float f2 = new Float(1.2f);
          
          f1 == f2 // false
          

          【讨论】:

          • @Juha,这似乎不是一份固定合同。当我查看 Float.java 的源代码时,我看到 public static Float valueOf(float f) { return new Float(f); } 我认为您不能指望 valueOf() 在所有情况下都有效(除非您可以生成相反的 JVM 规范)。
          • 亲爱的,我已经读到'==' 可以用于引用相等,但我认为 x1 和 x2 没有任何引用,对于 f1 和 f2 我认为这可能是真的,因为它们是对象类型!!!!!!
          • @Bob Cross:至少在自动装箱时,不需要缓存浮点数和双精度数。 JLS §5.1.7 (java.sun.com/docs/books/jls/third_edition/html/…) 说:“如果被装箱的值 p 是真、假、字节、\u0000 到 \u007f 范围内的字符,或者 -128 到 127 之间的整数或短数字,然后让 r1 和 r2 是 p 的任意两次装箱转换的结果。总是 r1 == r2。由于即使Float f1 = 1.2f; Float f2 = 1.2f; System.out.println(f1 == f2); 产生false,我发现不太可能有 缓存的工厂方法。
          • @mmyers,至少有一个。 Boolean.valueOf(true) 将返回 Boolean.TRUE。它使用三元运算符。诚然,当您可以只使用 Boolean.TRUE 本身时,这并不是很有趣......缓存的 Double.valueOf() 的想法会很有趣,但我永远不会指望返回的值相等。
          • @Bob,我实际上并没有检查代码,只是阅读了 javadoc。编辑了答案。
          【解决方案7】:

          在实际应用中,我建议你不要使用 float 或 Float,它不是很准确,而且几乎不是正确的解决方案,请改用 double 或 Double。

          【讨论】:

            【解决方案8】:
            1. 有了这个声明,你就有了一个基本类型 float 并为其分配了一个值。原始类型是不由其他数据类型组成的数据类型,不能进一步拆分(简单解释一下)。原始类型通常是内置类型。

            2. 在这种情况下,您创建了一个对象,它在内部由较小的数据类型组成,还包含方法。

            原始类型浮点型和对象类型的主要区别在于原始类型只是一种数据格式,没有属性或方法。

            3=1 可以正常工作,休息不行。

            【讨论】:

              猜你喜欢
              • 2020-01-22
              • 1970-01-01
              • 2011-01-14
              • 2012-05-25
              • 2014-07-16
              相关资源
              最近更新 更多