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的话,得到的结果会和预期不同。
以前写的博文: