【转】HashSet,LinkedHashSet,TreeSet 区别

[quote]java.util.AbstractSet-> java.util.TreeSet
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值