这似乎是一个愚蠢的问题,但为什么我们要覆盖 equals
方法而不是创建一个新的方法并使用新的名称进行比较呢?
如果我没有覆盖equals,那么 ==
和 equals 都会检查两个引用是否指向同一内存位置吗?
这似乎是一个愚蠢的问题,但为什么我们要覆盖 equals
方法而不是创建一个新的方法并使用新的名称进行比较呢?
如果我没有覆盖equals,那么 ==
和 equals 都会检查两个引用是否指向同一内存位置吗?
equals
方法而不是创建一个新的命名方法并使用它进行比较?ArrayList
, LinkedList
, HashSet
, HashMap
,等等)在决定两个对象是否相等时都使用equals
。ArrayList
之类的集合调用Object.equals
,则此调用将在运行时解析为被覆盖的方法。因此,即使您发明了集合不知道的类,它们仍然可以在这些类上调用方法,例如equals
。==
)和equals方法都会检查两个引用是否指向同一内存位置吗?Object.equals
的实现只执行==
检查。String a = "Hello"; String b = "Hello";
那么 ==
会起作用。 - aioobe如果你使用依赖于equals的类,比如HashMap
、HashSet
、ArrayList
等,那么你需要重写equals方法。
比如,如果你将自己的类的元素存储在HashSet
中,如果你希望元素的唯一性不是通过简单的引用相等来确定,那么你必须重写hashCode
和equals
方法。
是的,如果你不重写equals方法,默认的实现(在Object
类中实现)与==
相同。
equals
和hashCode
方法,任何阅读您代码的人都知道这些方法的作用。这样做告诉读者类的实例之间价值相等的标准。使用equals
方法阅读您代码的人将立即知道您正在检查值的相等性。equals()
是Object
类的一个方法,它是所有类的超类,因此在您编写的每个类中默认存在。equals()
用于对象比较,所以每个集合类或其他标准类都使用它。如果您希望其他类支持对自定义类对象进行相等性比较,则只需重写equals()
(因为其他类知道调用equals()
进行对象比较)。如果您仅使用自己的类,则可以创建一个新方法,并确保所有内容都使用您的自定义方法进行比较。HashMap<T,U>
这样的类需要有一些手段来确定集合中的哪个项目(如果有)应被视为与给定项目等价。这可以通过以下两种方式之一实现:
hashCode()
)来分配部分等价类)。Object
中省略 equals
和 hashCode()
,并使像 HashMap
这样的类型仅能与实现了包含这些成员的 equatable
接口的键类型一起使用;希望使用由身份标识为键值的引用集合的代码将不得不使用 IdentityHashMap
。这样的设计也不算不合理,但当前的设计使得一个使用 HashMap
的通用集合-of-集合类型可以与按值以及按标识进行比较的东西一起使用,而不必为 collection-of-HashMap 和 collection-of-IdentityHashMap 定义单独的类型。GeneralHashMap
类型,其构造函数需要指定一个比较函数,并且 IdentityHashMap
和 HashMap
都从它派生而来;后者会将其类型限制为 equatable
,并将其标识函数链接至其中包含的对象的标识函数。这种设计可能没有什么特别错误的地方,但事情并不是这样做的。equals(Object)
和 getHashCode()
就是一种方法。问题1
有两件事情。
equals()
位于Object类中,
集合框架在比较对象时使用equals()
和hashcode()
方法。
问题2
是的,用于比较两个对象。但是当您比较两个String对象时,equals()
仅检查值。
equals()
方法的数据结构呢?例如Map、Set等? - TheLostMindtoString()
,但是除了你自己的代码外,其他代码都不会使用它。 - Thilo