【问题标题】:Why won't "5".equals(5) evaluate to true? Aren't they both they same, both being 5?为什么 "5".equals(5) 不会评估为真?他们不是都一样,都是5吗?
【发布时间】:2018-11-28 14:07:44
【问题描述】:

我是 Java 新手,想知道为什么 "5".equals(5) 评估为真正的意思是两者都是 5 并且在我眼中似乎是同一件事(它们似乎与我相等)所以为什么不它评估它为真?

感谢您的帮助:)

【问题讨论】:

  • java 是静态类型的。谷歌它。
  • 他们不一样。你为什么会这样假设?如果它们“相同”,5.equals("5") 会做什么?
  • JavaScript 有一个以这种方式运行的运算符 (==)。现在大多数人建议不要使用它来支持===,因为有些奇怪的效果。
  • 在使用这种宽松的相等检查时遇到的“奇怪效果”的一个例子是很难保持瞬态:您说 String "5" 与 Character '5 基本相同' 或整数 5,但后来有人建议它也应该与罗马文字一起使用——毕竟“V”也是 5。突然你需要说字符串“5”等于字符串“V”或放弃传递性——你有“A等于B”和“B等于C”,但“A不等于C”——这导致各种错误和混乱。
  • @Hulk 可能是丢失传递性的一个更好的例子是5.05.00,它们与数字相同,但与字符串不同。

标签: java equals


【解决方案1】:

“5”是String,而5是整数,.equals方法也比较类型

【讨论】:

    【解决方案2】:

    深入了解函数的实际作用:

    它会检查您发送的值是否是String 的实例。

    public boolean equals(Object value) {
        if (value instanceof String){
           // continue comparing..
        }else{
           return false;
        }
    }
    

    如果该值不是 String 的实例,该方法将返回 false, 在您的情况下,5 是 Integer 的一个实例。

    这就是该方法将返回 false 的原因。

    【讨论】:

      【解决方案3】:
       "5".equals(5);
      

      可以写成:

       "5".equals(new Integer(5));
      

      只是为了说清楚:您最终将 String 对象与 Integer 对象进行比较(如果真的有 new Integer() 调用,或者 Integer.valueOf() 调用在这里无关紧要)。 String 类上没有 equals(int) 方法,因此编译器将 int 文字 5 转换为 Integer 对象(称为 boxing)。

      事情是:在 Java 中 equals() 方法(大多数情况下)会考虑对象的类型。一个字符串不能等于一个整数,永远不会。独立于不同对象“表示”的“内容”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        相关资源
        最近更新 更多