参考答案
1. 区别
hashCode()
- 是Object类下面的一个方法,供继承类重写,根据对象内存地址计算哈希值,String类重写了hashCode方法,并改为根据字符序列来计算哈希值。
- 调用该方法时,会返回一个hash码,只有指向同一个对象的引用变量调用才会返回相同值,而String类中放宽了要求,对象里的值相等也返回相同值。
identityHashCode()
- 是System类中的静态方法,根据对象内存地址来计算哈希值。
- 调用该方法时,不管类中是否重写了Object类中的hashCode方法,都执行Object类中的hashCode方法,返回一个hashCode值,所以只有指向同一个对象的引用变量调用才会返回相同值。
2. 实例
public static void main(String[] args) {
下面程序中s1和s2是两个不同对象。
String s1 = newString("Hello"); String s2 =newString("Hello");
String类重写了Object类的hashCode方法——改为根据字符序列计算hashCode值,因为s1和s2的字符序列相同,所以它们的hashCode方法返回值相同。
System.out.println(s1.hashCode() +"----" + s2.hashCode());
s1和s2是不同的字符串对象,所以它们的identityHashCode值不同,identityHashCode是根据对象的地址计算得到的,所以任何两个不同的对象的identityHashCode值总是不相等。
System.out.println(System.identityHashCode(s1)+ "----" +System.identityHashCode(s2));
s3和s4是相同的字符串对象,所以它们的identityHashCode值相同。
String s3 ="Java"; String s4 ="Java"; System.out.println(System.identityHashCode(s3)+"----" +System.identityHashCode(s4));}
结果:hashCode方法可以被重写并返回重写后的值,identityHashCode会返回对象的hash值而不管对象是否重写了hashCode方法。
69609650----69609650 13078969----3154093 28399250----28399250
以上,是Java面试题【hashCode和identityHashCode的区别】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—