equals hashcode compareTo原理
在讲原理之前,我们先看看三者在什么情况下使用:
容器:equals()
散列:hashcode() + equals()
有序:compareTo() + equals()
容器:如ArrayList linkedList
散列:如HashSet HashMap
有序:如TreeSet TreeMap
好了,现在我们看看他们在代码中的应用。
ArrayList扩展了AbstractList,AbstractList中有public int indexOf(Object o)方法,该方法调用了equals()进行比较Object是否相等。
HashSet中有public boolean add(E e)方法,该方法调用HashMap的put方法,该方法执行int hash = hash(key.hashCode());和if (e.hash == hash && ((k = e.key) == key || key.equals(k))),实际上就是调用hashcode() + equals()一起比较Object是否相等。
TreeSet中有public boolean add(E e)方法,该方法调用TreeMap的put方法,该方法执行cmp = k.compareTo(t.key);比较两个对象的大小;还有public boolean addAll(Collection<? extends E> c)方法,该方法不但调用compareTo()方法,而且调用了equals()方法。
通过对源代码的分析,我们可知:一般类型容器只需要实现equals()方法;如果是散列类型容器,需要实现hashcode() 和equals();如果是有序类型容器,需要实现compareTo() 和equals();如果是散列有序类型容器,需要实现compareTo()、hashcode() 和equals((),但是目前我还没有发现有这种类型。
相关资料还可参考:
关于重写equals,hashcode以及compareTo方法!:http://blog.csdn.net/bastengao/article/details/4064458
粗浅理解,还望同学们指正。
欢迎阅读相关文章: http://hi.csdn.net/linchengzhi