下面先看一段简单的demo
public class Test_01 { //主要看控制台输出和气质。。。 public static void main(String[] args) { //运行代码你会怀疑date和date1是同一个对象吗? List list = new ArrayList<>(); Date date = new Date(); list.add(date); System.out.println(date.hashCode()); System.out.println(list.size()); //如果你怀疑是同一个对象,请加上如下demo再试试 /* try { new Thread().sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } */ Date date1 = new Date(); list.remove(new Date()); System.out.println(date.hashCode()); System.out.println(list.size()); } }
没有加上注释的demo时,输出的两个hashCode是相同的值,加上注释后的demo后,输出的两个hashCode的值是不同,有没有想过为什么?只不过是Date类重写了equals方法和生成hashCode的方法而已,在Date类的源码中生成hashCode的方法如下
public int hashCode() { long ht = this.getTime(); return (int) ht ^ (int) (ht >> 32); }
Date源码中比较两个对象是否相等的equals方法如下
public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); }
看到这里大家心里应该明白为什么会出那样的问题了吧。
Date类重写了生成hash码的方法,以系统时间为参照生成当前对象的hash码,因此,如果在同一时间做new Date()操作,那么在这个运算下生成的hashCode就是相等,因此在Date类重写的equals方法中做判断返回的值也是true。
时间: 2024-10-05 05:11:48