HashSet底层数据结构是哈希表,通过一定的算法,得到的哈希值按照一定的顺序组成了哈希表,因为每个对象的哈希值不同,有可能第一个存入的对象的哈希值比后存入的对象的哈希值大,这种情况下,第一个存入的对象就排在其他比它哈希值小的后面,这就是为什么HashSet是无序的原因.
而实现情况,存入对象的时候,系统自动调用该集合的hashCode()方法来判断两个哈希值是否相等,如果不想等,判断结果为两个不同对象,不会调用equals()方法.如果不想等,则会继续调用equals()方法来做更深层次的判断两个对象是否是同一个对象.这就是为什么用HashSet集合存储自定义对象的时候必须复写hashCode()方法和equals()方法.
TreeSet底层数据结构是二叉树,判断是否是同一元素并排序的方法是compareTo()的返回值,图示如三楼的图.如果返回值是一个正数,则表示该对象大于传入对象,所以传入对象应放在该对象的左边.同理,小于0就放在该对象的右边.当出现等于0的情况时,需要自己定义深层判断对象相等的依据一遍判断对象是否是同一对象.
以上是我自己对该两种集合的理解,不完整或者不对的地方请见谅. |