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