一.HashMap篇
1.. HashMap的扩容操作是怎么实现的?
①.在jdk1.8中,resize方法是在hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容;
②.每次扩展的时候,都是扩展2倍;
③.扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。
在putVal()中,我们看到在这个函数里面使用到了2次resize()方法,resize()方法表示的在进行第一次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值值(第一次为12),这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上。
2.HashMap是怎么解决哈希冲突的?
答:在解决这个问题之前,我们首先需要知道什么是哈希冲突,而在了解哈希冲突之前我们还要知道什么是哈希才行;Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。这边分享一下教学视频,这里面有详细的解析。
二.并发编程面试题
1、基础知识
①. 并发编程的优缺点
充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升,方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。
并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如**:内存泄漏、上下文切换、线程安全、死锁**等问题。
关于并发编程也可以参考一下视频的教学内容:
Java面试热点问题,synchronized原理剖析与优化
三.MySQL
1..数据库的三范式是什么?
第一范式:表中的每个字段都不可分,具有原子性。
第二范式:满足第一范式,每个表只能表示一个事物,具有唯一性,所有的非主属性完全依赖每个主属性。
第三范式:满足第一范式,每个非主属性要直接依赖于主属性,不能传递依赖,每个非主属性之间没有依赖关系。
2.说一下 ACID 是什么?
原子性:要么全部执行,要么全部都不执行。
一致性:事务执行完成时,所有的数据在操作前后都是一致的状态。
隔离性:并发事务的操作须与其他并发事务的操作保持隔离。
持久性:事务完成后,对系统的影响是永久的,即便是系统故障也要一直保持
以上是比较基础的问题,更多面试热点问题和答案,可以参考下面的教学视频:
网友评论