Pan*_*kaj 5 java class hashcode
我有以下程序。
Employee employee1 = new Employee("Raghav1", 101);
Employee employee2 = new Employee("Raghav", 100);
// #1
System.out.println(employee1.hashCode() == employee2.hashCode());
// #2
System.out.println(employee1.getClass().hashCode() == employee2.getClass().hashCode());
Run Code Online (Sandbox Code Playgroud)
语句 1 返回,false因为两个员工对象不同,但语句 2 返回的原因true。
任何人都可以解释上述陈述之间的区别吗?
第一条语句比较两个员工实例的哈希码。这可能是该hashCode()方法的一个糟糕实现,因为似乎两个实例应该相等,因此应该具有相同的哈希码。
第二个语句获取每个实例的类并比较这些类的哈希码。由于employee1和employee2都是 的实例Employee,因此它们都具有相同的类,并且您只是比较对相同hashCode()方法的两次调用,它们必然返回相同的值。
让我们猜测以下表达式的输出:
Object obj = new Object();
System.out.println(obj.hashCode() == obj.hashCode());
Run Code Online (Sandbox Code Playgroud)
显然true对吗?因为无论您是否实现hashCode(),hashCode()对同一个实例的连续调用将始终返回相同的int值,前提是您没有在中间更改实例的状态。
一旦加载到 JVM 内存中的类本身也是一个实例。请记住,我不是在谈论您通过new关键字创建的实例,Employee.class它本身是一个java.lang.Class类的实例,当Employee.class加载任何引用的类时,JVM 隐式创建该实例,或者您可以将Class.forName("Employee.class")方法返回的类实例作为示例.
您甚至可以访问类实例上的所有 Object 类方法。如Employee.class.toString(),Employee.class.getClass()等,现在在你的声明#2,无论您的实例回报的参考同一个类的实例,这就是为什么你的表达式返回true。