==和equals的区别,为什么重写equals要重写hashCode

1.==和equals的区别

==    对于基本数据类型的变量,比较的是值。(基本数据类型在栈中存储的是值)

      对于引用类型的变量,比较的是变量所指对象的内存地址。(引用类型在栈中存储的是指向堆内存的地址)

equals   equals方法不能作用于基本数据类型。

      对于引用类型的变量,没有重写equals就是比较的是变量所指对象的内存地址;重写equals比较的是变量所指的对象的内容。String,Double,Integer,Date都对equals进行了重写。

2.为什么重写equals要重写hashCode

Java对于hashcode规定:两个对象相等其哈希值一定相等。

如果只重写equals不重写hashcode,比如例一:两个对象的成员属性值相等,equals比较相等,但是hashcode不等,与以上协议相悖。

 

例一:两个对象equals相等,hashcode不一定相同,重写equals没有重写hashcode;

例二:两个对象hashcode相等,equals不一定相等,重写equals和hashcode;

例三:当用hashmap存入自定义类时,不重写这个自定义类的equals和hashcode的话,得到的结果会和预期不同。

 

以前写的博文:

http://blog.sina.com.cn/s/blog_a475ac530102wli5.html

原文地址:https://www.cnblogs.com/yuki67/p/14230241.html