深入学习Java集合:HashSet的实现原理

深入学习Java集合:HashSet的实现原理

长沙牛耳教育      2022-05-01 14:21:01     22

深入学习Java集合:HashSet的实现原理,1.HashSet概述:HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒

课程价格 请咨询

上课时段: 授课校区:

详细介绍

1.HashSet概述:

HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT = new Object();。HashSet跟HashMap一样,都是一个存放链表的数组。

HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。

2.HashSet的实现:

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成, HashSet的源代码如下

public class HashSet<E>    extends AbstractSet<E>    implements Set<E>, Cloneable, java.io.Serializable{    static final long serialVersionUID = -5024744406713321676L;    // 底层使用HashMap来保存HashSet中所有元素。    private transient HashMap<E,Object> map;       // 定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。    private static final Object PRESENT = new Object();        public HashSet() {    map = new HashMap<E,Object>();    }        public HashSet(Collection<? extends E> c) {    map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));    addAll(c);    }        public HashSet(int initialCapacity, float loadFactor) {    map = new HashMap<E,Object>(initialCapacity, loadFactor);    }        public HashSet(int initialCapacity) {    map = new HashMap<E,Object>(initialCapacity);    }        HashSet(int initialCapacity, float loadFactor, boolean dummy) {    map = new linkedHashMap<E,Object>(initialCapacity, loadFactor);    }        public Iterator<E> iterator() {    return map.keySet().iterator();    }        public int size() {    return map.size();    }        public boolean isEmpty() {    return map.isEmpty();    }        public boolean contains(Object o) {    return map.containsKey(o);    }        public boolean add(E e) {    return map.put(e, PRESENT)==null;    }        public boolean remove(Object o) {    return map.remove(o)==PRESENT;    }        public void clear() {    map.clear();    }        public Object clone() {        try {            HashSet<E> newSet = (HashSet<E>) super.clone();            newSet.map = (HashMap<E, Object>) map.clone();            return newSet;        } catch (CloneNotSupportedException e) {            throw new InternalError();        }    }}

以上就是长沙牛耳教育Java培训机构小编介绍的“深入学习Java集合:HashSet的实现原理”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

相关文章

零基础怎么自学Java,完整版Java学习路线图

你还在纠结学Java,是自学还是去培训班吗

一个标准的Java程序员如何进阶?

Java学习路线清单,快速进阶Java

Java编程初学者要如何进阶

学习Java

学分高考提醒您:交易时请核实对方资质,对于过大宣传或承诺需谨慎!任何要求预付定金、汇款等方式均存在风险,谨防上当。