equals()方法code
Object类中的equals方法和“==”是同样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址。而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不一样”,他们比较的是值是否是相等。因此,当本身建立类时,自动继承了Object的equals方法,要想实现不一样的等于比较,必须重写equals方法。对象
当咱们new一个对象时,将在内存里加载一份它本身的内存,而不是共用!对于static修饰的变量和方法则保存在方法区中,只加载一次,不会再多copy一分内存。因此咱们在判断俩个对象逻辑上是否相等,即对象的内容是否相等不能直接使用继承于Object类的equals()方法,咱们必须得重写equals()方法,改变这个方法默认的实现。继承
重写equals方法:先判断比较对象是否为null—>判断比较对象是否为要比较类的实例—–>比较俩个成员变量是否彻底相等。内存
hashcode()方法:hash
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪个区间,再这个区间里调用equeals方法。这里须要注意的是:当俩个对象的hashCode值相同的时候,Hashset会将对象保存在同一个位置,可是他们equals返回false,因此实际上这个位置采用链式结构来保存多个对象。变量
但一个面临问题:若两个对象equals相等,但不在一个区间,由于hashCode的值在重写以前是对内存地址计算得出,因此根本没有机会进行比较,会被认为是不一样的对象。因此Java对于eqauls方法和hashCode方法是这样规定的:
1. 若是两个对象相同,那么它们的hashCode值必定要相同。也告诉咱们重写equals方法,必定要重写hashCode方法,也就是说hashCode值要和类中的成员变量挂上钩,对象相同–>成员变量相同—->hashCode值必定相同。
2. 若是两个对象的hashCode相同,它们并不必定相同,这里的对象相同指的是用eqauls方法比较。方法
注:若是咱们将对象的属性值参与了hashCode的运算中,在进行删除的时候,就不能对其属性值进行修改,不然会出现严重的问题。static