当前位置: 首页 > 面试题库 >

HashSet实现中的Null对象

汪辰阳
2023-03-14
问题内容

在Java API中,HashSet的实现使用Object作为
内部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;
}

但是HashMap允许其值为null。我认为并不需要填写该值,那么为什么要这样做呢?


问题答案:

因为HashSet合同指定了remove()返回值(true如果指定的对象存在并被删除)。为此,它使用包装的
HashMap#remove()方法返回已删除的值。

如果要存储null而不是存储对象,则对HashMap#remove()return 的调用将返回null,这与尝试删除不存在的对象的结果没有区别,并且HashSet.remove()无法履行的约定。



 类似资料:
  • 问题内容: 我一直在试图了解内部实现的和。 以下是我脑中浮现出一段时间的疑虑: HashMap / HashSet中的重要性是什么?内部在哪里使用此哈希码? 我通常已经看到HashMap的键是like 。我可以将值映射为(而不是String)吗?我需要遵守哪些所有合同才能成功完成? 提前致谢 ! 编辑: 我们是说键(校验!)的哈希码是在哈希表中映射值的实际对象吗?当我们这样做时,java在内部调用

  • 本文向大家介绍说一下 HashSet 的实现原理?相关面试题,主要包含被问及说一下 HashSet 的实现原理?时的应答技巧和注意事项,需要的朋友参考一下 HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSe

  • HashSet实际上是一个HashMap实例,数据存储结构都是数组+链表。 HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。 private static final Object PRESENT = new Object(); HashSet中add方法调用的是底层HashMap中的put方法,pu

  • 1.我了解不同的哈希映射机制和处理密钥冲突的方式(开放寻址-线性/二次探测、链接、可扩展哈希等)。哈希集/哈希映射使用哪一种? 2.我意识到好的哈希映射依赖于好的哈希函数。Java的HashSet/HashMap如何散列对象?我知道有一个散列函数,但到目前为止,对于字符串,我不需要实现它。如果我现在想对我创建的Java对象进行散列-我需要实现散列函数吗?或者Java有一种内置的创建哈希代码的方法吗

  • 请耐心等待,因为我试图引入一个与许多活动线程直接矛盾的新概念。 在HashSet中插入对象的条件是什么? 查看源代码,它会关注: 完整代码位于:HashSet.java 所以,这取决于 哈希码 等于() == 即如果它们是相同的对象。 看看条件4。尽管equals()返回false,但对象会被添加到HashSet。在所有其他情况下,当且仅当equals()返回false时,对象才会被添加。因此,可

  • 问题内容: 在,没有线程安全版本的HashMap命名的ConcurrentHashMap和线程安全版本TreeMap的命名ConcurrentSkipListMap,但没有对HashSet的。 相反,通常有4种使用线程安全的方法: 1所使用的同时实现和线程安全的。 2使用方式,似乎不推荐这种方式。 3是基于并被广泛使用的。 4是基于CopyOnWriteArrayList的,因此它具有的相同基本属