zoukankan      html  css  js  c++  java
  • Java面试题 从源码角度分析HashSet实现原理?

    面试官:请问HashSet有哪些特点?

    应聘者:HashSet实现自set接口,set集合中元素无序且不能重复;

    面试官:那么HashSet 如何保证元素不重复?

    应聘者:因为HashSet底层是基于HashMap实现的,当你new一个HashSet时候,实际上是new了一个map,执行add方法时,实际上调用map的put方法,value始终是PRESENT,所以根据HashMap的一个特性: 将一个key-value对放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果两个key的hash值相同,那么它们的存储位置相同。如果这个两个key的equalus比较返回true。那么新添加的Entry的value会覆盖原来的Entry的value,key不会覆盖。因此,如果向HashSet中添加一个已经存在的元素,新添加的集合元素不会覆盖原来已有的集合元素;

    源码分析

    先来看一下无参的构造函数:

    public HashSet() {
         map = new HashMap<>();
    }
    

    很显然,当你new一个HashSet的时候,实际上是new了一个HashMap

    再来看一下add方法:

    private static final Object PRESENT = new Object();
    
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    

    定义一个虚拟的Object PRESENT是向map中插入key-value对应的value,因为HashSet中只需要用到key,而HashMap是key-value键值对;所以,向map中添加键值对时,键值对的值固定是PRESENT。

    源码中HashSet的绝大部分方法都是通过调用HashMap的方法来实现的,其他的方法,就请大家自己查阅一下源码吧。

  • 相关阅读:
    家庭网络拓扑架构
    网络基础概念(IP、MAC、网关、子网掩码)
    centos7搭建docker并部署lnmp (转)
    docker容器里面安装php的redis扩展
    docker 安装ps命令
    Docker Ubuntu容器安装ping
    docker 安装nginx
    CentOS7 安装特定版本的Docker
    docker 卸载旧版本
    Centos7搭建Docker部署LNMP
  • 原文地址:https://www.cnblogs.com/marsitman/p/11215892.html
Copyright © 2011-2022 走看看