2021提前批-阿里面试凉经

    阿里突然袭击,电话面试,由于准备不充分,一面即挂。赶紧拿来面经学习一波学习过程中如有错误,欢迎私聊我纠正。

第一轮面试题

自我介绍

项目介绍

Java线程池的作用

答:线程池作用就是限制系统中执行线程的数量,用来解决线程生命周期开销问题和资源不足的问题。
(1)减少创建和销毁线程的次数,每个工作线程都可以被重复利用、可执行多个任务;
(2)根据系统的承受能力,调整线程池中工作线程的数量。防止因为消耗过多的内存,而把服务器累趴下。

1
2
3
private final static ExecutorService pool = new ThreadPoolExecutor(NR_THREADS, NR_THREADS, TIME_OUT,
TimeUnit.SECONDS, new SynchronousQueue<>(), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());

1、NR_THREADS 线程池核心线程的数量;
2、NR_THREADS 线程池可创建的最大线程数量;
3、TIME_OUT 线程最大空闲时间
4、指定了keepAliveTime的单位,可以为毫秒,秒,分,小时等
5、存储未执行的任务的队列;
6、创建线程的工厂,如果未指定则使用默认的线程工厂;
7、指定了当任务队列已满,并且没有可用线程执行任务时对新添加的任务的处理策略;

TreeSet的原理

答:TreeSet是一个有序的集合,基于TreeMap实现,支持两种排序方式:自然排序和定制排序。TreeMap采用一种被称为“红黑树”的排序二叉树来保存Map中的的每个Entry——每个Entry都被当做红黑树的一个节点来对待。

HashMap的原理

答:(1)扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。
(2)负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。
(3)HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap。
(4)JDK1.8引入红黑树大程度优化了HashMap的性能。
(5)HashMap在jdk1.7中采用头插入法,在扩容时会改变链表中元素原本的顺序,以至于在并发场景下导致链表成环的问题。而在jdk1.8中采用尾插入法,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。

深度优先搜索(dfs)的应用场景

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

数据库范式

(1)第一范式:数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

 | 字段1  | 字段2     | 字段3        | 字段4 |
|       |           | 字段3.1      |字段3.2|
|       |           |             |       |
|       |           |             |       |

上面是不符合第一范式的
(2)第二范式:简而言之,第二范式(2NF)就是非主属性完全依赖于主关键字。所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。满足第二范式的关系型数据库可可消除数据冗余、更新异常、插入异常和删除异常。
(3)第三范式:满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。简而言之,第三范式就是属性不依赖于其它非主属性。
传递函数依赖解释:指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。
举例:(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号) → (所在学院) → (学院地点, 学院电话) 存在非关键字段学院地点和学院电话传递函数依赖于学号
把学生关系表分为如下两个表:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。
(4)BCNF范式–鲍依斯-科得范式(BCNF是3NF的改进形式):若关系模式R是第一范式,且每个属性都不传递依赖于R的候选键。这种关系模式就是BCNF模式。即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合鲍依斯-科得范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。

计算机网络的三次握手原理

答:TCP是面向连接的协议,运输连接是用来传送TCP报文的,运输连接有三个阶段:连接建立、数据传送、连接释放 (三次握手和四次挥手)
三次握手:(1)A首先创建控制模块TCB,向B发出连接请求报文。首部中同部位SYN=1,序列号seq=x。SYN报文段(SYN=1的报文段)不能够携带数据,但是要消耗一个序列号。发送完之后,A进入SYN-SENT状态。(同步已发送状态)。
(2)B收到连接请求报文段后,如同意建立连接,就向A发送确认。确认字段中把 SYN 和 ACK 都置为1,确认号是ack=x+1,同时也为自己选择一个序列号:seq=y. 请注意,这个报文段也不能够携带数据,但是要消耗序列号。发送完之后,B进入SYN-RCVD状态(同步收到状态)。
(3)收到B的确认之后,还要向B给出确认。确认报文的ACK置为1,确认号ack=y+1,而自己的序号为seq=x+1。TCP标准规定,ACK报文可以携带数据,但是如果不携带数据则不消耗序号,在这种情况下,下一个数据报文的序号仍然是seq=x+1。发送完毕之后,TCP连接建立。A进入ESTABLISHED状态,B收到A的确认之后,也进入ESTABLISHED状态。
问题:为什么A最后还要发送一次确认呢?
答:主要为了防止已经失效的连接请求报文段突然又传送到B,因而产生错误。B会误认为新的连接已经建立,并会一直等待A发来的数据。

B+树和B-树的区别

答:B+树包含两种类型的结点:索引结点和叶子节点,根节点本身可以是索引结点也可以是叶子节点,且关键字个数至少有1个;
B+树和B-树的最大不同是内部节点(索引结点)不保存数据,只用于索引,所有数据都保存在叶子节点中;
m阶B+树索引结点最多有m-1个关键字,同时限定叶子节点最多存储m-1个记录;
内部节点和叶子节点都是遵从左小右大的原则;
每个叶子节点都存有相邻叶子节点的指针,叶子节点本身依关键字的大小自小而大顺序链接。
B-树的非终端节点也包含需要查找的有效信息。
因此B+树比B-树更适合应用于操作系统的文件索引或者数据库索引。

MyISAM非聚簇索引和Innodb中聚簇索引的区别

聚簇索引的顺序是数据的物理存储顺序,而非聚簇索引是索引顺序与数据物理排列无关。聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过是指向对应数据块的指针。

坚持原创技术分享,您的支持将鼓励我继续创作!