1、equals与==的区别
(1)如果通过String str = "kingsea"这样对String变量赋值,两种方式比较的结果是一样的。因为这样赋的内容一样时,系统就会直接从地址池里取出“kingsea”给str2,所以str1与str2的地址是一样的。但是如果通过String str = new String("Kingsea");这样对String对象赋值,两种比较的结果就不一样了。如果赋的内容一样,用==比较多结果是false,用equals比较的结果是true。如果赋的内容不一样,==与equals比较的结果都是false。这是因为new出了个新对象,系统就得为他俩都分配地址。这样他俩的地址是不一样的,但内容还是一样的。
所以可以理解为==比较的是地址,equals比较的是内容。但是这样的话,下面就有问题出现了,请看下面。
(2)我新建了个Person类如下
public class Person{
public String name;
public int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
我new两个对象:Person person1 = new Person("Kingsea";22);Person person2 = new Person("Kingsea";22);然后用==和equals比较,可是结果却都为false;这是为什么呢?后来发现了原来String这个类里的equals方法已经重写过了。而我建的Person类没有重写。所以结果是不一样的。
(3)总结:==比较的是地址,equals比较的是内容,这样理解一般不错,但是得在equals已经重写的前提下。所以下面请看equals如何重写。
2、equals方法的重写
可以通过eclipse自动写这个方法,也可以自己去写。具体内容为:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Persong other = (Person) obj;
if (name != other.name)
return false;
if (age != other.age)
return false;
return true;
}
3、hashCode方法的重写
重写equals时也必须得重写hashCode方法,这个也可以通过eclipse自动写这个方法,也可以自己去写。具体内容为:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
4、意外发现toString方法的重写
这个也可以通过eclipse自动写这个方法,也可以自己去写。具体内容为:
@Override
public String toString() {
return "Demo [name=" + name + ",age = " + age + "]";
}