理解HashSet里为什么Value不是Null

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

D49ED39C-4026-F7E8-0317-F0496772B1BD.png

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

9DBA47DB-8FB4-60A8-F2BC-ECB6E13E3BDB.png

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

5E7AC7F5-9C29-4827-A8BB-A2BC99A3AC1A.png

HashSet#add

2FAFFCB5-6829-37AE-FBBF-A604CF470339.png直接调用的HashMap#put

3C15C45A-EFF0-E3E4-80B5-1364BD4A722B.png

若HashMap#put:

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

    B147871B-9E08-A2C2-BAD9-E58878931957.png

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

HashSet#remove

C3754ED0-E45B-43D9-412D-F9373A3E7322.png

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

13DC287F-5011-48C9-CBB7-47ACB50B35EB.png

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

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据