简述:
"=="操作符专门用来比较两个对象的值是否相等,即用于比较变量所对应的内存中的数值是否相等。
equals()是用于比较两个独立对象的内容是否相同。
根据上面的简述,我们来看一段代码。

按照上面对==和equals的简述,equals比较的是对象的内容是否相等,我们可以看到p1和p2的id都为1,username都为老李,所以对象的内容是应该是相等的。==比较的是内存中所存储的值是否相等,如果一个变量指向的数据是对象类型的,这时候就涉及到了两块内存,变量占一块内存,对象也占一块内存,即p1是一块内存,new People(xxx)又是一块内存,此时变量内存中存储的是另外一块内存,如果p1和p2相等,那就等于两次new开辟出来的是同一块内存,这显然是错误的。我们来看下程序的运行结果

怎么回事?按照上面的分析,equals验证的应该要相等才对,怎么变成这样呢?
我们来看看People的实现

原来是因为People没有实现自己的equals()方法,它默认的equals()方法是从Object中来的,我们来看下它的源码:
public boolean equals(Object obj) {
return (this ==obj);
}
其内部就相当于调用==操作符,所以输出的是false。
那我们要怎么重写equals()方法,才能使p1==p2为true呢?我们来看下具体的代码。
网友评论