面试复盘 |百度java软开三面

1、char为什么是2个字节?char能存储汉字么?int的取值范围?

Java语言内部存储采用的是Unicode编码,Unicode编码中的每个字符占两个字节。

中文也是占两个字节,所以,Java中的字符可以存储一个中文汉字。

-2^31 ~ 2^31-1,int 占 4字节,也就是 32 位,int 是有符号的,最高位为符号位,所以剩下31个位置。

2、TCP如何保证不乱序?

发送端滑动窗口(发送端缓冲区):已发送但是未经确认分组的序号构成的空间,每发送一个分组前沿前移一个单位,收到老分组的确认后沿前移一个单位
接收端滑动窗口(接收端缓冲区):只有收到的分组序号落入接收窗口内才允许接收,若序号在接收窗口之外,则丢弃。接收窗口尺寸 Wr=1 ,则只能顺序接收,使用GBN协议(回退N步);接收窗口尺寸 Wr>1 ,则可以乱序接收,使用SR协议(选择重传)。
GBN协议:新分组落入发送缓冲区范围,发送 -> 前沿滑动;接收窗口收到乱序分组,没有落入到接收窗口范围内,抛弃,落入到接收窗口范围内,重复发送老分组的确认(累计确认);发送端来了老分组的重复确认 -> 后沿不向前滑动,超时重发机制(发送端拥有对最老的未确认分组的定时器)会重新发送后沿的分组。
如序号1和序号2成功接收了,但下一次和下下次又接收了4和5,接收窗口抛弃序号4和5,向发送窗口发送2的重复确认,发送窗口将重新发送3、4、5。
SR协议:新分组落入发送缓冲区范围,发送 -> 前沿滑动,接收窗口收到乱序分组,没有落入到接收窗口范围内,抛弃,落入到接收窗口范围内,接收,发送该分组的单独确认;发送端来了乱序分组的确认 -> 后沿不向前滑动,超时重发机制(发送方为每个未确认的分组保持一个定时器)让发送端将超时的分组重新发送出去。
如序号1和序号2成功接收了,但下一次和下下次又接收了4和5,接收窗口缓存序号4和5,接收窗口向发送窗口发送4和5的乱序确认,此时序号3超时了,将会重新发送3

3、Tomcat底层原理

tomcat启动入口在Bootstrap类下的main()函数,调用init()方法的核心是创建Catalina类的一个实例,解析server.xml并完成Connector、StandardServer、StandardService、StandardEngine、StandardHost的实例化。

其中在实例化StandardHost时会调用deployApps()就是部署Host中项目,具体是创建StandardContext的实例(每部署一个项目都会生成一个StandardContext的实例),并将其作为子容器添加到StandardHost中,StandardHost启动完成后启动它的子容器StandardContext。

实例化完各组件后就会对我们项目中web.xml文件进行解析处理,从web.xml中解析的所有内容(Filter、Listener、Servlet)都会添加到对应项目的StandardContext实例中,从web.xml中解析到listener,web项目中的spring容器才真正启动

接下来调用loadOnStartup()方法来初始化servlet,DispatcherServlet就是在这儿初始化,此时一个项目的基本启动流程算是执行完了。

4、Spring中web.xml、springmvc.xml、applicationContext.xml文件什么时候初始化

在启动tomcat的时候

5、DispatcherServlet是每次拦截到url都会新建一个吗

Spring MVC 中由一个单例的 DispatcherServlet 处理所有请求

6、当有多个url的时候,哪个时刻开始为其分配线程

Connector组件初始化后: 一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户

感受

面试官人很好,问的问题偏实用性,不是简单的八股文,之前没怎么了解过tomcat的具体运行,多亏这次面试让我又懂了一些知识,很宝贵的一次面试经历!

#面试复盘##面经##百度#
全部评论
我去 问的好偏底层啊
点赞 回复
分享
发布于 2022-05-15 23:34

相关推荐

点赞 评论 收藏
转发
3 25 评论
分享
牛客网
牛客企业服务