这两个方法重写一个时必须重写另一个,否则使用hashmap等集合时可能会发生错误,在java的集合中,判断两个对象是否相等的规则是:
1),判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
比如下面的代码
由以上规则也可以看出:equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
如果重写了某个类的equals()方法而不重写hashCode()方法,那么很有可能出现这种情况:将两个用equals()判断相等的对象放到hashmap中,却因为其hashCode()不等而认为不等(hashCode默认利用其引用地址来计算的),从而都放了进去,这就违背了java所制定的规则。
分享到:
相关推荐
### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...
当`HashSet`试图添加`b`时,它首先检查`b`的`hashCode()`是否与已经存在的任何对象的`hashCode()`相同。由于`a`和`b`的`hashCode()`相同,`HashSet`会假设这两个对象相等,但实际上它们不相等(因为没有重写`equals...
是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 ...
默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。 @ToString 生成toString方法,默认情况下,会输出类名、所有属性,属性会...
对象类别构造函数,getter,setter,toString,equals,hasCode方法; 超载; 封装; 保留字这个; 遗产; 多态性内存中对象,数组和列表的行为; 枚举; 对象的组成; 异常处理; 使用Scanner进行数据输入和读取文件...
2. `<application>`标签中的`android:hasCode="false"`表明应用本身不包含Java代码。 3. `<activity>`标签指定了使用`android.app.NativeActivity`作为主活动,这是一个内置的框架类,用于处理与NDK(Native ...
此外,`Field.HasCode`和`Field.IsLocked`等属性可以帮助你更好地控制域的行为。 在`GetFieldContent`这个例子中,可能是一个示例程序,它读取输入的Word文档,提取所有域的解析结果,并可能将这些内容输出到控制台...
- `android:hasCode`: 表示应用是否包含代码。通常为`true`,若为`false`,则应用无法执行。 - `android:icon`: 定义应用的图标,是一个图标的资源引用。 - `android:label`: 应用的显示名称,是字符串资源的引用...