【问题标题】:Comparison with operator ==, how does it work?与运算符 == 比较,它是如何工作的?
【发布时间】:2015-02-27 08:54:03
【问题描述】:

我在 Java 测试中提出了以下问题:

import java.awt.Button;
class CompareReference 
{
    public static void main(String [] args) 
    {
        float f = 42.0f;
        float [] f1 = new float[2];
        float [] f2 = new float[2];
        float [] f3 = f1;
        long x = 42;
        f1[0] = 42.0f;
    }
}

哪三个陈述是正确的?

  1. f1 == f2
  2. f1 == f3
  3. f2 == f1[1]
  4. x == f1[0]
  5. f == f1[0]

我只需要选择 3 个语句。

嗯,1 显然是错误的,因为我们在比较两个不同的引用,2 显然是正确的,因为引用是相同的。但我不知道原语。我感到困惑的是,如果我们比较 Integers 在 -128 到 127 的范围内,它们正在缓存。相关topic。有没有关于原语的东西,一些狭窄的情况?

我一直在寻找它在 JLS 8 中的工作原理,但没有发现任何有用的东西。

【问题讨论】:

  • 就是自动装箱的时候,这里没有自动装箱,只是简单的原始值比较
  • 确实如此。你也可以运行一个程序来输出上面的真/假值。
  • 第三个表达式甚至无法编译。
  • 为什么是import java.awt.Button;? :D
  • @St.Antario - 是的。检查this question

标签: java comparison comparison-operators


【解决方案1】:

比较 3 不会编译:它会尝试将数组与标量进行比较。

比较 4 和 5 涉及原语并按值完成。不涉及引用或自动装箱。因此,以下内容与此处无关:

我感到困惑的是,如果我们在 -128 到 127 的范围内比较 Integers,它们正在缓存。

由于42 可以完全表示为float,比较4 将返回true

比较 5 也将返回 true,因为它正在比较两个相同的 float 值。

【讨论】:

    【解决方案2】:

    2、4 和 5 是true

    虽然请记住,通过== 比较浮点数可能会很棘手,但这样做更安全:

    Math.abs(float1 - float2) < epsilon

    epsilon 是一个很小的数字(精度)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2011-02-19
      • 2019-12-29
      • 2015-07-02
      相关资源
      最近更新 更多