理解HashSet里为什么value不是null

最近面试,遇到一些关于 HashSet 的不寻常的八股

HashSet底层的value为啥不是一个 null呢,效率不是更高,还省得创建对象了?

那我们先来看下,这个 value 何时会被用到呢?

HashSet#add

直接调用的HashMap#put

若HashMap#put:

  • 成功,则返回null
  • 失败,说明key已存在,就返回该key的value

综上,若底层hashmap的value维护的是null,则 HashMap#put 成功或失败都会返回null,则 HashSet#add 每次返回值都是true,就无法确认add是否成功了。

HashSet#remove

HashSet的remove依旧直接使用HashMap#remove

HashMap#remove会返回value,所以若底层value都存null,就无法区分是否移除成功。

到此这篇关于理解HashSet里为什么value不是null的文章就介绍到这了,更多相关Java HashSet内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 实例讲解Java HashSet

    HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合. HashSet 允许有 null 值. HashSet 是无序的,即不会记录插入的顺序. HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的. 您必须在多线程访问时显式同步对 HashSet 的并发访问. HashSet 实现来 Set 接口. HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类. 基本类型对应的包装类表如下: 基本类型 引用类型

  • 通过实例学习Java集合框架HashSet

    这篇文章主要介绍了通过实例学习Java集合框架HashSet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 示例 1 : 元素不能重复 Set中的元素,不能重复 package collection; import java.util.HashSet; public class TestCollection { public static void main(String[] args) { HashSet<String> names = n

  • java中HashSet的特点及实例用法

    1.HashSet和TreeSet区别 HashSet底层使用Hash表. 确保元素唯一性的原理:判断元素的hashCode值是否相同.如果是一样的话,会继续判断元素的equals方法是否是true. TreeSet底层采用红黑树. 确保元素的唯一性是通过Comparable或Comparator接口实现的. 2.HashSet和HashMap区别 事实上,HashSet的底层实现还是HashMap,只是它只使用了Key,具体如下: (1)在HashSet的add方法的底层,使用HashMap的

  • Java HashSet(散列集),HashMap(散列映射)的简单介绍

    简介 本篇将简单讲解Java集合框架中的HashSet与HashMap. 散列集(HashSet) 快速入门 底层原理:动态数组加单向链表或红黑树.JDK 1.8之后,当链表长度超过阈值8时,链表将转换为红黑树. 查阅HashSet的源码,可以看到HashSet的底层是HashMap,HashSet相当于只用了HashMap键Key的部分,当需要进行添加元素操作时,其值Value始终为常量PRESENT = new Object().以下为HashSet的代码片段: private transi

  • Java基础之详解HashSet的使用方法

    Java HashSet HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合. HashSet 允许有 null 值. HashSet 是无序的,即不会记录插入的顺序. HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的. 您必须在多线程访问时显式同步对 HashSet 的并发访问. HashSet 实现了 Set 接口. HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类. 添加元素 HashSet

  • 理解HashSet里为什么value不是null

    最近面试,遇到一些关于 HashSet 的不寻常的八股 HashSet底层的value为啥不是一个 null呢,效率不是更高,还省得创建对象了? 那我们先来看下,这个 value 何时会被用到呢? HashSet#add 直接调用的HashMap#put 若HashMap#put: 成功,则返回null 失败,说明key已存在,就返回该key的value 综上,若底层hashmap的value维护的是null,则 HashMap#put 成功或失败都会返回null,则 HashSet#add 每

  • 深入理解Vue3里的EffectScope

    Vue 3.2 版本引入了新的 Effect scope API,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理.使用 getCurrentScope 返回当前活跃的 effect 作用域.使用 onScopeDispose 在当前活跃的 effect 作用域上注册一个处理回调函数.当相关的 effect 作用域停止时会调用这个回调函数. const scope = effectScope()

  • 为何HashSet中使用PRESENT而不是null作为value

    目录 1. 为什么 HashSet 中使用 PRESENT 而不是 null 作为 value 1.1. PRESENT 是个什么玩意 1.2. HashSet 的构造方法 1.3. PRESENT 何时会被用到 1. 为什么 HashSet 中使用 PRESENT 而不是 null 作为 value 无意之中碰到了这个问题,在此记录一下 1.1. PRESENT 是个什么玩意 HashSet 的部分源码如下 public class HashSet<E> extends AbstractSe

  • 深入理解Javascript里的依赖注入

    迟早你需要用到其他开发人员的抽象成果--即你依靠别人的代码.我喜欢依赖自由(无依赖)的模块,但那是难以实现的.甚至你创建的那些漂亮的黑盒子组件也或多或少会依赖一些东西.这正是依赖注入大显身手的之处.现在有效地管理依赖的能力是绝对必要的.本文总结了我对问题探索和一些的解决方案. 一.目标设想我们有两个模块.第一个是负责Ajax请求服务(service),第二个是路由(router). 复制代码 代码如下: var service = function() {    return { name: '

  • HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码: public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { // 使用 HashMap 的 key 保存 HashSet 中

  • 详解mysql三值逻辑与NULL

    什么是NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值.数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的. 两种 NULL 这种说法大家可能会觉得很奇怪,因为 SQL 里只存在一种 NULL .然而在讨论 NULL 时,我们一般都会将它分成两种类型来思考:"未知"(unknown)和"不适用"(not applicable,inapp licable).

  • 从柯里化分析JavaScript重要的高阶函数实例

    目录 前情回顾 百变柯里化 缓存传参 缓存判断 缓存计算 缓存函数 防抖与节流 lodash 高阶函数 结语 前情回顾 我们在前篇 <从历史讲起,JavaScript 基因里写着函数式编程> 讲到了 JavaScript 的函数式基因最早可追溯到 1930 年的 lambda 运算,这个时间比第一台计算机诞生的时间都还要早十几年.JavaScript 闭包的概念也来源于 lambda 运算中变量的被绑定关系. 因为在 lambda 演算的设定中,参数只能是一个,所以通过柯里化的天才想法来实现接

  • 关于JavaScript数组去重的一些理解汇总

    前言 做前端开发几年,在项目中用到数组去重的机会倒不是很多,但是在面试的时候却经常被问到,个人理解,这道题真正考的是对JavaScript的基础的掌握,因为有很多种方式可以做到.这次就根据这道题,将相关的知识理解透彻. 一.ES6中的new Set方式 先看看MDN上对Set的描述: Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用. Set对象是值的集合,你可以按照插入的顺序迭代它的元素. Set中的元素只会出现一次,即 Set 中的元素是唯一的. 关键字:任何类型都可以存储

  • 为什么mysql字段要使用NOT NULL

    最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章. 基于目前大部分的开发现状来说,我们都会把字段全部设置成NOT NULL并且给默认值的形式. 通常,对于默认值一般这样设置: 整形,我们一般使用0作为默认值. 字符串,默认空字符串 时间,可以默认1970-01-01 08:00:01,或者默认0000-00-00 00:00:00,但是连接参数要添加zeroDateTimeBehavior=convertToN

随机推荐