扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
这里面涉及到了HasCode()
和equals()
两个方法。
- equals()
先看下String
类中重写的equals
方法。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
从源码中可以看到:
equals
方法首先比较的是内存地址,如果内存地址相同,直接返回true
;如果内存地址不同,再比较对象的类型,类型不同直接返回false
;类型相同,再比较值是否相同;值相同返回true
,值不同返回false
。总结一下,equals
会比较内存地址、对象类型、以及值,内存地址相同,equals
一定返回true
;对象类型和值相同,equals
方法一定返回true
。- 如果没有重写
equals
方法,那么equals
和==
的作用相同,比较的是对象的地址值。
- hashCode
hashCode
方法返回对象的散列码,返回值是int
类型的散列码。散列码的作用是确定该对象在哈希表中的索引位置。关于hashCode
有一些约定:- 两个对象相等,则
hashCode
一定相同。 - 两个对象有相同的
hashCode
值,它们不一定相等。 hashCode()
方法默认是对堆上的对象产生独特值,如果没有重写hashCode()
方法,则该类的两个对象的hashCode
值肯定不同
- 两个对象相等,则
介绍完equals()方法和hashCode()方法,继续说下HashSet是如何检查重复的。
HashSet
的特点是存储元素时无序且唯一,在向HashSet
中添加对象时,首先会计算对象的HashCode
值来确定对象的存储位置,如果该位置没有其他对象,直接将该对象添加到该位置;如果该存储位置有存储其他对象(新添加的对象和该存储位置的对象的HashCode
值相同),调用equals
方法判断两个对象是否相同,如果相同,则添加对象失败,如果不相同,则会将该对象重新散列到其他位置。
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版