equal 与 hashCode
2024-09-06 07:44:42
equal
Object:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
默认情况下:
从超类Object继承而来的equals方法与"=="是完全等价的,比较的都是对象的内存地址。
但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。
父类:
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj instanceof Person) {
Person p = (Person) obj;
return super.equals(p) && name.equals(p.name);
}
return false;
}
子类:
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj instanceof Student) {
Student s = (Student) obj;
return super.equals(s) && name.equals(s.name);
}
return super.equals(obj);
}
比较的元素不能是子类中声明的新变量(拥有统一的语义),否则不能进行混合比较。
如果equals的语义在每个子类中有所改变,就使用getClass检测:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return name.equals(student.name);
}
hashCode
Object:
@HotSpotIntrinsicCandidate
public native int hashCode();
Student类:
@Override
public int hashCode() {
return Objects.hash(name);
}
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
重写equals()的同时还得重写hashCode(),主要是针对映射相关的操作(Map接口):
如果两个对象通过调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。
Map接口的类会使用到键对象的哈希码:
Java使用hashCode()来获取对象的哈希码,其值就是对象的存储地址,这个方法在Object类中声明,因此所有的子类都含有该方法。
当我们调用put方法或者get方法对Map容器进行操作时,都是根据键对象的哈希码来计算存储位置的,
因此如果我们对哈希码的获取没有相关保证,就可能会得不到预期的结果。
如果两个对象通过调用equals方法是不相等的,不要求这两个对象调用hashCode方法必须返回不同的整数(HashMap)。
但是对不同的对象产生不同的hash值可以提高哈希表的性能。
最新文章
- CSS3 @keyframes 动画
- 给div添加滚动条
- Java提高篇——对象克隆(复制)
- Rendering pipeline overview(读书笔记1 --- Real-Time rendering)
- 获取google翻译的音频文件_合并音频文件的方法
- 七、CCScene
- Android——inflate 将一个xml中定义的布局找出来
- (转载)PHP中刷新输出缓冲
- Windows上右键git菜单出来的原因
- Adobe flash CC 汉化破解方法
- php给数组key:value中的key加引号
- orcle :Could not initialize ";D:\app\Administrator\product\11.2.0\dbhome_1\bin\oci.dll"; Make sure you have the 32 bits Oracle Client installed.
- 如何在MySQL中设置外键约束以及外键的作用
- Flex读取txt文件中的内容(二)
- 在 Mac OS X 上安装 TensorFlow
- 【Spring学习】【Java基础回顾-数据类型】
- 【vue】vue +element 搭建项目,Qs用途
- SPA单页面优缺点
- 莫烦theano学习自修第八天【分类问题】
- resin4.0.23+nginx1.1集群