false
说明:1.system.out.println(Object)输出的是Object.toString(),Student类重写了hashcode方法,如果不重写则结果不一样
2.== 比较的不仅仅是对象在虚拟机中的内存地址
深入了解hashcode与内存分配:
HashCodeMeaning.java
package com.leo.test.action;
import java.util.ArrayList;
/**
* @author MK
*
* 此方法的作用是证明 java.lang.Object的hashcode 不是代表 对象所在内存地址。
* 我产生了10000个对象,这10000个对象在内存中是不同的地址,但是实际上这10000个对象
* 的hashcode的是完全可能相同的
*/
public class HashCodeMeaning {
public static void main(String[] args) {
ArrayList list = new ArrayList();
int numberExist=0;
//证明hashcode的值不是内存地址
for (int i = 0; i < 10000; i++) {
Object obj=new Object();
if (list.contains(obj.toString())) {
System.out.println(obj.toString() +" exists in the list. "+ i);
numberExist++;
}
else {
list.add(obj.toString());
}
}
System.out.println("repetition number:"+numberExist);
System.out.println("list size:"+list.size());
//证明内存地址是不同的。
numberExist=0;
list.clear();
for (int i = 0; i < 10000; i++) {
Object obj=new Object();
if (list.contains(obj)) {
System.out.println(obj +" exists in the list. "+ i);
numberExist++;
}
else {
list.add(obj);
}
}
System.out.println("repetition number:"+numberExist);
System.out.println("list size:"+list.size());
}
}
运行输出结果:
java.lang.Object@922804 exists in the list. 1778
java.lang.Object@e29820 exists in the list. 2077
repetition number:2
list size:9998
repetition number:0
list size:10000
说明:
存入hashcode到list中时不同对象的hashcode有可能相等,而不同对象的内存地址是不相等的
现在脑子里还有点混乱 需要深刻理解下。
哪位可以给我点详细的资料啊?
补充:
如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。