[quote]java.util.AbstractSet-> java.util.TreeSet
java.util.AbstractSet-> java.util.HashSet-> java.util.LinkedHashSet
HashSet的效能通常都优于TreeSet,特别是最重要的两个动作:安插和查找。
AbstractSet是个abstract 类
TreeSet能够维护其内元素的排序状态。
LinkedHashSet维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。 [/quote]
[quote]HashSet:
[b][color=blue]无序无重复,允许null,非synchronized[/color][/b]
boolean add(E e):
先得到e的hashCode -> a,然后遍历内部HashMap,看是否有等于a的
无:
add成功,返回true
有:
该元素 -> _e
if(e,_e指向相同的内存地址 || e.equals(_e))
add失败,返回false
else
add成功,返回true
LinkedHashSet:
[b][color=blue]有序(按插入顺序)无重复,允许null,非synchronized[/color][/b]
基本同HashSet,但严格按照插入顺序排列,如果删除某元素再重新添加,则排在最后
TreeSet:
[b][color=blue]有序(可自定义顺序)无重复,不允许null,非synchronized[/color][/b]
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[/quote]
java.util.AbstractSet-> java.util.HashSet-> java.util.LinkedHashSet
HashSet的效能通常都优于TreeSet,特别是最重要的两个动作:安插和查找。
AbstractSet是个abstract 类
TreeSet能够维护其内元素的排序状态。
LinkedHashSet维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。 [/quote]
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);
}
}
[quote]HashSet:
[b][color=blue]无序无重复,允许null,非synchronized[/color][/b]
boolean add(E e):
先得到e的hashCode -> a,然后遍历内部HashMap,看是否有等于a的
无:
add成功,返回true
有:
该元素 -> _e
if(e,_e指向相同的内存地址 || e.equals(_e))
add失败,返回false
else
add成功,返回true
LinkedHashSet:
[b][color=blue]有序(按插入顺序)无重复,允许null,非synchronized[/color][/b]
基本同HashSet,但严格按照插入顺序排列,如果删除某元素再重新添加,则排在最后
TreeSet:
[b][color=blue]有序(可自定义顺序)无重复,不允许null,非synchronized[/color][/b]
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[/quote]