美文网首页
HashSet(模拟底层HashMap实现)

HashSet(模拟底层HashMap实现)

作者: 寂静的春天1988 | 来源:发表于2019-01-13 21:38 被阅读0次

HashSet的特点:
1、不保证Set的迭代顺序
2、特别是不保证该顺序恒久不变
3、元素唯一。

HashSet的底层结构是HashMap
哈希表依赖于哈希值存储。
添加功能底层依赖两个方法,hashCode()和equals()方法。

1、查询:只能通过增强for或者迭代器得到值,没有通过索引得到值的方法
2、增加

public HashSet() {
        map = new HashMap<>();
}
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
}

从add方法就可以看出它底层是通过HashMap实现的。
它将传进来的元素当作key,value是一个常量的Object。
利用了HashMap的特点,实现了Set从元素唯一的特性。具体怎么实现的在HashMap的文章中再具体分析。
3、删除:

public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
}

这里没什么好说的,还是直接调用的HashMap的remove方法,具体在HashMap中再分析。
4、改
HashSet中没有关于索引的操作,自然也没有set之类的方法,不过可以通过add方法来覆盖之前的值。

        LinkedHashSet set=new LinkedHashSet<Object>();
        set.add("1");
        set.add("3");
        set.add("2");
        for (Object object : set) {
            System.out.println(object.toString());
        }
//1 3 2

值得一提的是LinkedHashSet继承至HashSet,唯一不同的是底层是通过LinkedHashMap实现的,可以实现查询的时候有序性。
TreeSet底层是通过TreeMap实现

package com.yidu.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.TreeMap;
import java.util.Vector;

import org.omg.Messaging.SyncScopeHelper;
/**
 * 模拟set集合(底层HashMap实现)
 * @author Administrator
 */
public class MyHashSet{
    private HashMap<Object, Object> map;
    public MyHashSet(){
        map=new HashMap<>();
    }
    public void add(Object obj){
        map.put(obj, null);
    }
    public void remove(Object obj){
        map.put(obj, null);
    }
    public int size(){
        return map.size();
    }
    public static void main(String[] args) {
        MyHashSet set=new MyHashSet();
    }
}




相关文章

网友评论

      本文标题:HashSet(模拟底层HashMap实现)

      本文链接:https://www.haomeiwen.com/subject/pgzldqtx.html