==
比较两个对象是否指向同一块存储空间
equlas
Object类中的方法与==一样
比较两个变量指向的对象是否是同一对象
源码
public boolean equals(Object obj) {
return (this == obj);
}
如果想比较两个实例对象的内容是否相同,那么必须覆盖equals()方法
例如String类的equals方法是用于比较两个独立对象的内容是否相同
HashCode
在object中也是用来鉴定两个对象是否相等,object类中的hashcode()方法返回对象在内存中地址转换成一个int值,所以如果没有重写hashcode()方法,任何对象的hashcode()方法都是不相等的
源码
public native int hashCode();
native主要用于方法上
1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。
2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的
主要是因为JAVA无法对操作系统底层进行操作,但是可以通过jni(java native interface)调用其他语言来实现底层的访问。
综合:
一般覆盖equals()也要覆盖hashcode()方法,否则会违反Object.HashCode的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类(hashmap、hashset和hashtable)结合在一起正常运行
如果x.equals(y)返回true的话,那么hashcode()都必须产生同样的整数结果,但是返回false的话hashcode()方法返回的值也有可能相等,反之hashcode()方法的返回值不相等可以推出equals()方法的返回值也不相等
案例:
分析:
“12” + “3”在编译器就被转换为“123”,存放在常量区 是指向同一个对象所以三个是一样的。
总结
hashcode是系统用来快速检索对象而使用