1、写在前面:
对于一个不是那么白的小白,写这篇文章主要是告诫自己在以后工作生活中要对一个知识点,一个事情要完全弄懂,弄明白!同时也是对知识的巩固
场景:
面试官:两个 x.equals(b)==true ,hashcode是否相同
我 :相同
面试官:hashcode相同,两个对象是否相同
我 : (思考ing)不一定相同
2、为什么不一定相同
我们来验证一下:
@Data
static
class Mode{
private String name;
private String value;
//重载
public int hashCode(){
return 1;
}
public Mode(String name, String address) {
this.name = name;
this.value = address;
}
@Override
public boolean equals(Object obj) {
System.out.println("这是equals方法");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Mode other = (Mode) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "model [name=" + name + ", address=" + value + "]";
}
}
public static void main(String[] args) {
HashSet<Mode> hashSet = new HashSet<>();
hashSet.add(new Mode("1", "A"));
hashSet.add(new Mode("2", "0"));
hashSet.add(new Mode("2", "1"));
Iterator<Mode> iterator = hashSet.iterator();
System.out.println("哈希值:");
System.out.println(new Mode("1", "A").hashCode());
System.out.println(new Mode("2", "a").hashCode());
System.out.println(new Mode("2", "1").hashCode());
System.out.println("遍历:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
打印结果:
这是equals方法
这是equals方法
这是equals方法
哈希值:
1
1
1
遍历:
model [name=1, address=A]
model [name=2, address=0]
model [name=2, address=1]
3、总结
- 对象相等则hashCode一定相等;
- hashCode相等对象未必相等
3)hashCode是所有java对象的固有方法,如果不重载的话, 返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。 如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同