Java 这两种说法有什么区别吗? float ff=1.2f Float fo=新浮点数(1.2f) double fg=3.2d Double fh=新的双精度(2.1d)

Java 这两种说法有什么区别吗? float ff=1.2f Float fo=新浮点数(1.2f) double fg=3.2d Double fh=新的双精度(2.1d),java,types,floating-point,primitive,Java,Types,Floating Point,Primitive,我可以在(1)和(3)之间或(2)和(4)之间使用“=”?是,2创建一个对象。是。第一个声明了一个基本类型float的变量,并将其初始化为1.2 第二个变量声明引用类型为Float,创建类型为Float的对象,然后为该变量分配引用。是 生成一个名为“float”的普通旧数据类型(也称为基本类型) 生成一个名为Float的Java对象,该对象保存的值恰好与(1)相同 回答编辑问题: 你会看到 如果尝试ff=fg,则显示“可能失去精度”消息 “不兼容类型”如果您尝试fo=fh fg=ff可以正常工作

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

是,2创建一个对象。

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

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

  • 生成一个名为“float”的普通旧数据类型(也称为基本类型)
  • 生成一个名为Float的Java对象,该对象保存的值恰好与(1)相同
  • 回答编辑问题:

    你会看到

  • 如果尝试
    ff=fg
    ,则显示“可能失去精度”消息
  • “不兼容类型”如果您尝试
    fo=fh
  • fg=ff
    可以正常工作(浮动适合双精度)
  • fh=fo
    仍将为您提供“不兼容类型”

  • 是的,第一个是基元类型,第二个是封装基元浮点类型功能的装箱类,例如,我们需要第二个用于集合中。在您必须处理大量类型转换之前(我认为直到Java1.5),现在包装器类的存在就需要这些功能。更多信息

    是的,基本类型不能为NULL,对象可以。此外,Float对象还附带了一系列有用的实用函数。

    newfloat(1.2f)每次都会创建一个新的Float对象,这会消耗内存

    如果使用工厂方法,JVM可能会为相同的值重用现有的浮点对象实例。只有在没有具有相同值的Float实例的情况下,它才能创建新的对象实例

    通常,您需要使用Float.valueOf(1.2f)而不是新的Float(1.2f)

    还请注意,使用equals操作符时,基本体和对象的工作方式不同

    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
    

    在实际应用中,我建议您不要使用float或float,它不是非常精确,而且几乎从来都不是正确的解决方案,请使用double或double

  • 有了这个声明,您就有了一个基本类型float并为其赋值。基元类型是不由其他数据类型组成的数据类型,不能进一步拆分(简单地解释一下)。primitive通常是内置类型

  • 在本例中,您已经创建了一个对象,在内部它由较小的数据类型组成,并且还包含方法

  • 原语类型float和对象类型之间的主要区别在于,原语只是一种数据格式,没有属性或方法


    3=1可以,其余的不行。

    如果我加上这两个语句==>3)double fg=3.2d;4) 双fh=新双(2.1d);我可以在((1)和(3)之间或者((2)和(4))之间使用“=”?@Neda,如果你尝试“ff=fg”,你会看到“可能失去精度”的消息,如果你尝试“fo=fh”,你会看到“不兼容类型”的消息。@Neda,同样,“fg=ff”也可以正常工作(浮动适合双精度),但是“fh=fo”仍然会给你一个“不兼容类型”。亲爱的鲍勃,你介意解释一下这个“fh=fo”吗,因为fo是浮动的,fh是双精度的!!!!我能用“==”表示(2)和(4)吗?@Neda,“Double”和“Float”是非常不同的东西。他们使用与“double”和“float”相同的英语单词这一事实与此无关。你可以说Double fh=fo.doubleValue(),然后得到一个值与浮动值非常相似的Double。@Juha,这似乎不是一个固定的合同。当我查看Float.java的源代码时,我看到了
    publicstaticfloatvalueof(Float f){returnnewfloat(f);}
    我不认为valueOf()在所有情况下都能工作(除非你能生成一个与之相反的JVM规范)。亲爱的,我已经读到“==”可以用于引用相等,但是我认为x1和x2没有任何引用,对于f1和f2,我认为这可能是真的,因为它们是对象类型@Bob Cross:至少在自动装箱时,浮点数和双精度数不需要缓存。JLS§5.1.7()说:“如果装箱的值p为真、假、一个字节、一个字符在\u0000到\u007f范围内,或者是一个介于-128和127之间的整数或短数字,那么让r1和r2为p的任意两个装箱转换的结果。r1==r2的情况总是如此。”因为偶数
    浮点f1=1.2f;浮动f2=1.2f;System.out.println(f1==f2)
    生成
    false
    ,我发现不太可能有一个工厂方法可以缓存。@mmyers,至少有一个。Boolean.valueOf(true)将返回Boolean.true。它使用三元运算符。不可否认,当你只使用Boolean.TRUE本身时,它不是很有趣。。。。缓存Double.valueOf()的想法很有趣,但我永远不会指望返回的值相等。@Bob,我实际上没有检查代码,只是阅读了javadoc。编辑了答案。理解自动装箱是理解这一点的关键。如果使用正确的方法,Java将自动从Float转换为Float,再转换为double。