【转】HashSet,LinkedHashSet,TreeSet 区别

引用
java.util.AbstractSet-> java.util.TreeSet
java.util.AbstractSet-> java.util.HashSet-> java.util.LinkedHashSet
HashSet的效能通常都优于TreeSet,特别是最重要的两个动作:安插和查找。
AbstractSet是个abstract   类
TreeSet能够维护其内元素的排序状态。
LinkedHashSet维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。

package com.test;  
  
import java.util.HashSet;  
import java.util.LinkedHashSet;  
import java.util.TreeSet;  
  
/**  
 *    HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;  
 *    LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;  
 *    TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。 
 *  
 */  
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:
无序无重复,允许null,非synchronized
boolean add(E e):
   先得到e的hashCode -> a,然后遍历内部HashMap,看是否有等于a的
   无:
       add成功,返回true
   有:
       该元素 -> _e
       if(e,_e指向相同的内存地址 || e.equals(_e))
           add失败,返回false
       else
           add成功,返回true

LinkedHashSet:
有序(按插入顺序)无重复,允许null,非synchronized
基本同HashSet,但严格按照插入顺序排列,如果删除某元素再重新添加,则排在最后

TreeSet:
有序(可自定义顺序)无重复,不允许null,非synchronized
   if(构造函数TreeSet(Comparator<? super E> comparator))
       使用外部比较器,优先级高
   else
       add某元素的自然比较(所以add的某元素必须实现Comparable)
      
boolean add(E e):
   进行比较
       // Comparator: public int compare(T o1, T o2)
       // Comparable: public int compareTo(Object o)
       返回 0:表示比较的两个元素相等,add失败,返回 false
       返回 正数或负数:
           正数:往后排
           负数:往前排
           add成功,返回true

你可能感兴趣的:(linkedhashset)