搞懂JAVA集合类--HashSet, LinkedHashSet, TreeSet(五)

来源:互联网 发布:免费淘宝代码 编辑:程序博客网 时间:2024/05/29 03:30

HashSet, LinkedHashSet, TreeSet分别使用HashMap,LinkedHashMap和TreeSetMap作为底层实现

HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
HashSet 判断两个对象相等的标准除了要求通过 equals() 方法比较返回 true 之外,还要求两个对象的 hashCode() 返回值相等。如果要放入Set中, 对象的这两个方法必须同时重写。

LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。查询都是基于Hash表,性能相当。

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。使用Comparable接口。如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法,创建 set 时所提供比较器。
注意一点,TreeSet理论上不需要重写HashCode和Equals方法,但compare方法可能会调用Equals方法,建议重写

0 0
原创粉丝点击