class Test
{
public int hashCode()
{
return 20;
}
}
class Demo
{
public static void main(String[] args)
{
Test t1=new Test();
Test t2=new Test();
System.out.println(t1.hashCode()+"\t"+t1+"\t"+t1.toString());
System.out.println(t2.hashCode()+"\t"+t2+"\t"+t2.toString());
//toString()-->getClass().getName() + '@' + Integer.toHexString(hashCode())
System.out.println(t1==t2);//false 比较的是t1和t2指向的对象的首地址
System.out.println(t1.equals(t2));//false 同上
}
}
明明复写了Object中的hashCode(),为什么还是false?对象的首地址和哈希值不同?
详细说明下,不要说废话..
麻烦剖析下t1==t2;JVM到底是怎么执行的?能否一步一步详细说明下?
感谢..
麻烦说下,当比较t1==t2时,JVM内部是怎么执行的?(这点迷惑)
能不能详细说明下?
当运行 == 运算时,确实比较的是两个对象的内存地址,但不是调用hashCode方法。
我初学哈,
equals在object中
public boolean equals(Object obj) {
return (this == obj); //如果不重写 JVM 内部怎么执行的?
} //是不是调用this.toString()和obj.toString()然后去比较?
如果不重写,jvm直接就比较内存地址,是不是一个对象。
你可以理解成是toString,因为对于没有重写toString方法的类,toString输出的是地址信息。
但是实际上不会这么做。不会调用toString方法,toString有调用取地址的方法,因为这样不是多余吗?直接调用取地址的方法比较就可以了。
我现在明白对象在内存地址和对象的hashCode()是两个概念- -,
学过数据结构,哈希表,处理冲突- - 太浅了
呵呵,我是在想 如果在调用toString()
相当于
getClass().getName() + '@' + Integer.toHexString(hashCode())
这里面的hashCode()是被我复写的- -
比较的是内存地址....
Object中的hashcode是本地方法,是调用C++的函数实现的。
如果有c++基础,你可以看下源码,现在这个源码读开放了。
不过也很麻烦啊,方法调来调去的,也不是很好读。
谢谢了 - - 初学java
this==obj,jvm是怎么执行的,是不是先 求出this.toString()和obj.toString( )然后再比较?
追答this == obj 就是比较的内存地址,一般只有对同一个对象的引用,才会有 o1 == o2