HashSet、LinkedHashSet、TreeSet的区别

来源:互联网 发布:sql中什么是主键 编辑:程序博客网 时间:2024/05/16 19:24

HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;

LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;  

TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。

package com.test;    import java.util.HashSet;  import java.util.LinkedHashSet;  import java.util.TreeSet;    public class SetDemo {        public static void main(String[] args) {            HashSet<String> hs = new HashSet<String>();          hs.add("B");          hs.add("A");          hs.add("D");          hs.add("E");          hs.add("C");          hs.add("F");          System.out.println("HashSet 顺序:\n"+hs);                    LinkedHashSet<String> lhs = new LinkedHashSet<String>();          lhs.add("B");          lhs.add("A");          lhs.add("D");          lhs.add("E");          lhs.add("C");          lhs.add("F");          System.out.println("LinkedHashSet 顺序:\n"+lhs);                    TreeSet<String> ts = new TreeSet<String>();          ts.add("B");          ts.add("A");          ts.add("D");          ts.add("E");          ts.add("C");          ts.add("F");          System.out.println("TreeSet 顺序:\n"+ts);      }  }

 

输出结果:

HashSet 顺序:[D, E, F, A, B, C] LinkedHashSet 顺序:[B, A, D, E, C, F]TreeSet 顺序:[A, B, C, D, E, F]

 

另外,重点区别HashSet、TreeSet:

 

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key

2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.

3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.

      a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.

      b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的Entry.

      c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value

4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.

      a. Comparator可以在创建TreeMap时指定

      b. 如果创建时没有确定,那么就会使用key.com

 

http://www.cnblogs.com/ibook360/archive/2011/11/28/2266062.html

http://blog.csdn.net/foart/article/details/4263456