自己实现LinkedHashSet-通俗易懂

前言

前一篇博客实现了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()+" ");
        }
    }
}

效果截图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37499059/article/details/80620277
今日推荐