【转】HashSet,LinkedHashSet,TreeSet 区别
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