为什么Java使用';等于';而不是'==';要检查对象';地图上有什么东西?

为什么Java使用';等于';而不是'==';要检查对象';地图上有什么东西?,java,equals,Java,Equals,假设我想在地图中放置一个键及其值 我相信Java就是这样做的: 获取密钥的Hashcode,并检查映射中是否有具有相同Hashcode的密钥 如果没有具有相同哈希代码的键,则可以将该键放入Map中 如果有一个键具有相同的哈希代码,则使用equals确定该键是否可以放入Map中 我的问题是,为什么不在这个过程中使用==而不是equals?按照您的建议做会打破equals/hashCode的整个概念。equals和hashCode都将变得无用,甚至不应该存在 Java允许程序员为他的类定义相等集;如

假设我想在地图中放置一个键及其值

我相信Java就是这样做的:

  • 获取密钥的Hashcode,并检查映射中是否有具有相同Hashcode的密钥

  • 如果没有具有相同哈希代码的键,则可以将该键放入Map中

  • 如果有一个键具有相同的哈希代码,则使用equals确定该键是否可以放入Map中


  • 我的问题是,为什么不在这个过程中使用
    ==
    而不是
    equals

    按照您的建议做会打破
    equals
    /
    hashCode
    的整个概念。
    equals
    hashCode
    都将变得无用,甚至不应该存在

    Java允许程序员为他的类定义相等集;如果他不想这样做,他可以简单地选择不重写
    equals
    hashCode
    ——最终得到您所建议的语义

    举一个具体的例子,根据您的建议,这将在地图中创建两个单独的条目:

    Map<Integer, String> map = new HashMap<>();
    map.put(10_000, "a");
    map.put(10_000, "a");
    

    将打印
    null
    ,因为您当然使用第三个键来获取。实际上,按键检索任何映射值都是不可能的。

    按照您的建议执行操作将打破
    等于的整个概念。
    equals
    hashCode
    都将变得无用,甚至不应该存在

    Java允许程序员为他的类定义相等集;如果他不想这样做,他可以简单地选择不重写
    equals
    hashCode
    ——最终得到您所建议的语义

    举一个具体的例子,根据您的建议,这将在地图中创建两个单独的条目:

    Map<Integer, String> map = new HashMap<>();
    map.put(10_000, "a");
    map.put(10_000, "a");
    
    将打印
    null
    ,因为您当然使用第三个键来获取。实际上,不可能通过键检索任何映射值。

    因为“==”用于比较2个对象的引用和
    .equals()
    内容。使用Java Collection JFrame时的一个重要规则是重写equals方法,以及
    .hashCode()
    这样,如果有两个具有相同内容的对象要映射到同一个键(哈希代码)。 如果不重写.enquals,则调用的方法将来自比较引用与“==”的对象类。重写
    .hashCode()
    时的一个重要细节是使用最终字段。

    因为“==”用于比较两个对象的引用和
    .equals()
    内容。使用Java Collection JFrame时的一个重要规则是重写equals方法,以及
    .hashCode()
    ,这样,如果有两个具有相同内容的对象要映射到同一个键(哈希代码)。
    如果不重写.enquals,则调用的方法将来自将引用与“==”进行比较的对象类。重写
    时的一个重要细节是使用最终字段。

    在java==中,用于检查引用相等性,而equals()和hashCode()在对象相等性方面协同工作。

    如果需要与==一起工作的映射,请使用。

    在java中==用于检查引用相等性,而equals()和hashCode()一起工作以检查对象相等性。

    如果需要使用==的映射,请使用。

    键属于对象类型,并且所有类都是从对象类中派生的。如果您使用的是自己编写的类的键,并且没有重写类中的equals方法,那么会发生什么?答案如下:

    无论类的两个对象是否具有完全相同的属性值,但equals的结果仍然是false。仅仅因为default equals impressions将检查两个对象是否指向同一个内存位置。这正是==比较所做的


    现在来看看equals和not==的hashMap用法。这是因为当您尝试在映射中放置一个键时,JVM会尝试检查两个对象是否相等。JVM检查这种相等性的唯一智能是使用equals方法。在其默认实现中,它将执行==Comparison将执行的操作。但正如我上面提到的,如果两个对象具有相同的属性,那么它们实际上是相等的。但遗憾的是==Comparison无法进行属性比较并得出真实值。因此,重写equals方法或使用equals方法在逻辑上很重要,同时将值存储在映射中。

    键属于对象类型,所有类都从对象类中删除。如果您使用的是自己编写的类的键,并且没有重写类中的equals方法,那么会发生什么?答案如下:

    无论类的两个对象是否具有完全相同的属性值,但equals的结果仍然是false。仅仅因为default equals impressions将检查两个对象是否指向同一个内存位置。这正是==比较所做的


    现在来看看equals和not==的hashMap用法。这是因为当您尝试在映射中放置一个键时,JVM会尝试检查两个对象是否相等。JVM检查这种相等性的唯一智能是使用equals方法。在其默认实现中,它将执行==Comparison将执行的操作。但正如我上面提到的,如果两个对象具有相同的属性,那么它们实际上是相等的。但遗憾的是==Comparison无法进行属性比较并得出真实值。因此,覆盖equals方法或使用equals方法在逻辑上很重要,同时将值存储在映射中。

    ==
    从面向对象的意义上讲,没有多大意义

    新整数(3)
    新整数(3)
    新整数(2+1)
    都应与