Java 中new Date()之hashCode
2016-07-03 14:52
627 查看
下面先看一段简单的demo
没有加上注释的demo时,输出的两个hashCode是相同的值,加上注释后的demo后,输出的两个hashCode的值是不同,有没有想过为什么?只不过是Date类重写了equals方法和生成hashCode的方法而已,在Date类的源码中生成hashCode的方法如下
Date源码中比较两个对象是否相等的equals方法如下
看到这里大家心里应该明白为什么会出那样的问题了吧。
Date类重写了生成hash码的方法,以系统时间为参照生成当前对象的hash码,因此,如果在同一时间做new Date()操作,那么在这个运算下生成的hashCode就是相等,因此在Date类重写的equals方法中做判断返回的值也是true。
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。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树