产品及行业资讯
News
两个高频设计面试问题:如何设计HashMap和线程池
你好,我是。我最近一直在收集面试问题,但是我写的这个版本不是记忆版本,也不是刻板印象的死记硬背。
我的初衷是对此进行一些思考,对每个主题给出自己的理解和解释性答案,然后您需要自己记住和记住该版本。因为八足论文在面试中是必须的,也就是说,必须知道的问题仍然必须知道,在理解的基础上记忆会更深,并且可以处理一些变体问题。
但是尚不清楚这种格式是否流行,因此我将提出两个问题来查看响应。因此,如果您认为此格式不好并且需要改进,请留言。
1.如果要求您设计HashMap,该如何设计?我认为这个问题可以从HashMap的一些关键点开始,例如哈希函数,如何处理冲突以及如何扩展。首先让我谈谈您对HashMap的理解。
例如:HashMap仅仅是存储格式的集合,因此可以通过键入O(1)时间复杂度来寻找价值。基本原理是通过散列函数对键进行散列以获得散列值,然后使用散列值对数组进行调制以获得对应的索引。
因此,哈希函数非常重要。计算不仅需要快速,而且还需要均匀分布以减少哈希冲突。
并且由于输入值是无限的,并且数组的大小是有限的,因此肯定会发生冲突,因此可以使用zipper方法来处理冲突。为了避免恶意哈希攻击,当拉链超过一定长度时,可以将其转换为红黑树结构。
当然,仍然需要扩展多个节点,否则冲突将非常严重。普通扩展会导致较大的放置延迟,尤其是在HashMap存储大量数据时,因此您可以考虑延迟两个表(如redis)的移动,并且一次只能移动其中一部分。
但是这样内存就很紧,因此要根据场景进行权衡。另外,最好在使用准数据之前估计其大小,以免频繁扩展。
基本上,答案几乎是相同的。 HashMap包含几个关键元素,然后取决于访问者的要求。
无论如何,它可能会扩展到诸如线程安全性之类的问题,只需按照currentHashMap的设计来回答即可。实际上,有些主题似乎在询问如何设计,但实际上,您只是回答了您对这件事的理解,并谈论了它的原理和一些关键点。
例如,我上面提到的估计的准数据大小似乎与设计没有任何关系,但是足以让面试官知道您对此方面很敏感。因此,有时可以“回答错误的问题”。
如果面试官觉得您的回答方向错误,他自然会提醒您,您可以在这个时候来临。简而言之,许多问题并不能真正地对面试问题做出严格的回答,因为面试官通常只问这些问题。
2.如果要求您设计线程池,该如何设计?这种设计问题仍然相同。首先,让我们谈一下理解,表明您知道这件事的用法和原理,然后开始BB。
基本上,根据现有设计,添加一些个人意见。简而言之,线程池是用于存储线程的容器。
之前创建的线程存储在池中以重复执行任务,从而减少了创建和销毁线程的开销,提高了任务的响应速度,并简化了线程管理。我个人认为,如果要设计线程池,则必须考虑池中工作线程的管理,任务调度和执行,线程池重载处理解决方案,监视等等。
初始化线程的数量,核心线程的数量和最大线程池都是公开的且可配置的,包括有关超出核心线程数量的线程的空闲终止的相关配置。然后,任务的存储结构也必须是可配置的。
它可以是无界队列或有界队列。也可以将其划分为多个队列,以根据配置分配不同优先级的任务。
窃取机制还可以用于提高线程利用率。 。
提供配置以指示线程池是IO密集型还是CPU密集型,以更改任务的执行策略。可能有许多重载的解决方案,包括丢弃任务,拒绝任务和引发异常,丢弃最旧的任务或对其进行自定义。
至于监控,线程池