1.==和equals的区别
“==”如果变量是基本类型则比较的是数值是否相等;如果是引用类型的变量,则比较的是所指对象的地址是否相等。
举个栗子:
int a = 123;
long b =123l;
ab;//true
String a = new String(“123”);
String b = new String(“123”);
ab; //false
equals不能作用于基本数据类型变量,如果其他类在继承Object类之后,如果没有对equals重写的话,那么比较的是引用类型的变量所指向的对象地址;String,Date,Integer(基本数据类型几乎都重写了equals)类对equals方法进行了重写,比较的就是对象的内容了。
举个栗子:
String a = new String(“123”);
String b = new String(“123”);
a.equals(b);//true
2.什么时候我们需要重写equals?
Set的元素都是引用类型的时候,为了确保不重复,我们需要重写equals
3.怎么重写equals方法?
重写equals之前,必须先重写hashcode方法,因为实现比较的两个对象的hash值是否相等,再判断值。如果x.equals(y),那么x,y的hashcode值一定相等,反则不一定。
4.为什么重写equals方法就一定要重写hashcode呢?
比方说HashSet它的底层实现是HashMap,在加入第10001个引用类型数据的时候,要想数据不重复,我们就要拿这个新元素去和前面的10000个元素进行比较,效率是非常的低;所以我们引入了hashcode,它就是为了查找元素更快捷诞生的,我们先用hashcode取个模,然后把它固定到某个位置,如果这个位置不存在其他的元素,就创建这个对象;如果这个位置有其他元素,就继续调用equals,如果有相同元素就不用再创建,如果没有相同元素就创建。这样效率得到了大幅度的提升。
5.hashcode是啥?
hashcode是为了查找快捷而产生的,在散列存储结构中存储对象的。
如果两个对象相等,那么hashcode值一定相等。
如果hashcode相等,只能说明,这两个对象在散列存储结构的存储位置相同。
如果要重写equals那么要先重写hashcode;