这两个语句有什么区别吗?涉及IT技术相关内容。

3
  1. float ff = 1.2f; //将1.2f赋值给变量ff
  2. Float fo = new Float(1.2f); //创建新的Float对象fo,其值为1.2f
  3. double fg = 3.2d; //将3.2d赋值给变量fg
  4. Double fh = new Double(2.1d); //创建新的Double对象fh,其值为2.1d

我能在(1)和(3)之间或者(2)和(4)之间使用'='吗?

答案是可以的。这两种情况下,'='都表示将右侧的值赋给左侧的变量。


如果我添加这两个语句 ==> 3)double fg = 3.2d; 4)Double fh = new Double(2.1d);我可以在(1)和(3)之间,或者(2)和(4)之间使用“=”吗? - Johanna
@Neda,如果你尝试执行"ff = fg",你会看到一个"可能会丢失精度"的警告信息;如果你尝试执行"fo = fh",则会出现"类型不兼容"的错误提示。 - Bob Cross
@Neda,另外,“fg = ff”会正常工作(浮点数适应双精度),但“fh = fo”仍然会出现“不兼容的类型”。 - Bob Cross
亲爱的鲍勃, 你介意再解释一下"fh=fo"吗?因为fo是Float类型,而fh是Double类型!!! 我能在(2)和(4)中使用'=='吗? - Johanna
@Neda,“Double”和“Float”是非常不同的东西。它们使用与“double”和“float”相同的英语单词这一事实是无关紧要的。你可以做的是说 Double fh = fo.doubleValue(),并得到一个值非常接近Float值的Double。 - Bob Cross
8个回答

21

是的。

  1. 创建了一个名为“float”的普通数据类型(又称原始类型)。
  2. 创建了一个Java对象Float,它保存了与(1)相同的值。

回答编辑问题:

如果尝试使用ff = fg,您将看到“可能会丢失精度”的消息。

如果尝试使用fo = fh,则会出现“不兼容的类型”消息。

  1. fg = ff可以正常工作(float适合double)。
  2. fh = fo仍然会给您一个“不兼容的类型”。

7

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


7

是的,第一种是原始类型,第二种是封装原始浮点类型功能的包装类,我们需要第二种来在集合中使用。在Java 1.5之前,你必须经常处理类型转换,现在有了包装类,这些功能已经被实现。更多信息请参阅这里


理解自动装箱是理解这个关键。如果你以正确的方式询问,Java会自动转换从Float到float再到double到Double。 - Alex Feinman

3

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

而第二个声明了一个引用类型Float的变量,创建了一个类型为Float的对象,然后将引用赋值给该变量。


2
"new Float(1.2f)"每次都会创建一个新的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规范)。 - Bob Cross
亲爱的, 我已经阅读了“==”可以用于引用相等性,但我认为x1和x2没有任何引用,对于f1和f2,我认为这可能是正确的,因为它们是对象类型!!! - Johanna
1
@Bob Cross:至少在自动装箱时,浮点数(Float)和双精度数(Double)不需要被缓存。JLS §5.1.7(http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7)规定:“如果要被装箱的值p是true、false、范围在\u0000到\u007f之间的byte或者char,或者是-128到127之间的int或short数值,则无论将p进行多少次装箱转换,总是有r1 == r2。”由于即使Float f1 = 1.2f; Float f2 = 1.2f; System.out.println(f1 == f2);的结果是false,我觉得很不可能存在一个进行缓存的工厂方法。 - Michael Myers
@mmyers,至少有一个。Boolean.valueOf(true)会返回Boolean.TRUE。它使用了三元运算符。诚然,当你可以直接使用Boolean.TRUE时,这并不是非常有趣...有一个缓存的Double.valueOf()的想法很有趣,但我永远不会指望返回的值相等。 - Bob Cross
@Juha,好的,我同意这个答案。+1 - Bob Cross
显示剩余2条评论

1

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


1
  1. 通过这个声明,您拥有了一个原始类型的浮点数,并为其分配了一个值。原始类型是由没有其他数据类型组成的数据类型,它不能被进一步分割(简单地解释)。原始类型通常是内置类型。

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

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

3=1可以正常工作,其他则不行。


0
在实际应用中,我建议您不要使用 float 或 Float 类型,因为它们的精度不够高,很少是正确的解决方案。相反,建议您使用 double 或 Double 类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接