您的位置:首页 > 编程语言 > Java开发

java容器之Set接口

2014-04-02 10:06 288 查看
HashSet

简单介绍:
HashSet类是基于HashMap实现的,它利用定义HashMap<E,object>成员来存储数据,同时定义一个finalstatic Object PRESENT 来与每一个E配对;
接下来看下源代码:
类的成员:

private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();


构造函数:(仅显示一个哈)
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}

添加元素:(如果已经存在该元素了,那么返回false)
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

删除元素:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}

  在已经熟悉HashMap的情况下,HashSet还是相当好理解的;
linkedHashSet

简单介绍:
具有可预知迭代顺序的Set 接口的哈希表和链接列表实现。它是基于LinkedHashMap实现的;同时,如果插入已有的元素,不会改变原先有的插入顺序;
看下LinkedHashSet类,如下
public class LinkedHashSet<E> extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable

发现它是继承HashSet的,那么为什么说他是基于LinkedHashMap实现的而不是HashMap呢?
那是因为在HashSet中有一个受保护的构造器,如下所示:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

对于LinkedHashSet类,我们不提供新的方法,但是提供了4中构造方法,它们都是super()上方这个构造器的,我们取其中一个说明:
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}


TreeSet

简单介绍:
TreeSet与HashSet比较类似,都是基于Map实现的,只不过TreeSet是基于TreeMap实现的,它利用定义NavigableMap<E,Object>(这是TreeMap的父类)成员对象来存储数据,同时定义一个final static Object PRESENT 来与每一个E配对;
添加数据:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
移除数据:
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
这个真没什么好讲的,关键是熟悉TreeMap的实现原理哈。。。






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: