前言
前一篇博客实现了HashSet,而LinkedHashSet是在HashSet的基础上,用链表维护遍历出的顺序。对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。
代码实现
LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同,因此LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个LinkedHashMap来实现,在相关操作上与父类HashSet的操作相同,直接调用父类HashSet的方法即可。
1)把上篇博客的HashSet接口添加addAll(),并添加一个4参构造函数
//添加集合
boolean addAll(Collection<? extends E> e);
@Override
public boolean addAll(Collection<? extends E> e) {
boolean modified=false;
for (E c:e){
if (add(c));
modified=true;
}
return modified;
}
/**
* LinkedHashSet会调用该构造函数
* @param initialCapacity 初始容量
* @param inithialLoadFactor 加载因子
* @param dummy 标记
*/
public MyHashSet(int initialCapacity,float inithialLoadFactor,boolean dummy){
this.map = new LinkedHashMap<>(initialCapacity,inithialLoadFactor);
}
MyLinkedHashSet(4个构造函数)
package com.cxx.list.linkedhashset;
import com.cxx.list.hashset.MyHashSet;
import com.cxx.list.hashset.MySet;
import java.util.Collection;
import java.util.HashSet;
/**
* @Author: cxx
* 对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。
* t底层使用LinkedHashMap来保存所有元素
* 实现简单:只提供了四个构造方法
* @Date: 2018/6/8 10:33
*/
public class MyLinkedHashSet<E> extends MyHashSet<E> implements MySet<E>{
//底层会调用父类的构造方法,构造一个带默认初始容量16和加载因子0.75的LinkedHashMap
public MyLinkedHashSet(){
super(16,.75f,true);
}
/**
* @param initialCapacity 初始容量
*/
public MyLinkedHashSet(int initialCapacity){
super(initialCapacity,.75f,true);
}
/**
*
* @param initialCapacity 初始容量
* @param initialLoadFactor 加载因子
*/
public MyLinkedHashSet(int initialCapacity,float initialLoadFactor){
super(initialCapacity,initialLoadFactor,true);
}
/**
*
* @param c 其中的元素将存放在此set中的collection
*/
public MyLinkedHashSet(Collection<? extends E> c){
super(Math.max(2*c.size(),11),.75f,true);
addAll(c);
}
}
测试代码
package com.cxx.list.linkedhashset;
import com.cxx.list.hashset.MySet;
import java.util.Iterator;
/**
* @Author: cxx
* LinkedHashSet 测试
* @Date: 2018/6/8 11:01
*/
public class MyLinkedHashSetTest{
public static void main(String[] args) {
MySet mySet = new MyLinkedHashSet();
mySet.add(1);
mySet.add(8);
mySet.add(2);
Iterator iterator = mySet.iterator();
//希望按顺序输出1 8 2
while (iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
}