Java面试题自我总结(三)

本文总结了Java面试中常见的问题,包括XML与JSON的区别,TCP的三次握手和四次挥手过程,解释了为什么建立连接是三次握手而关闭连接是四次挥手,以及TIME_WAIT状态的原因。此外,还讨论了Servlet的单线程特性、生命周期,GET与POST请求的不同,转发与重定向的差异,静态与动态包含的对比,以及JSP的内置对象。
摘要由CSDN通过智能技术生成

1.xml和json的区别

区别:
1.传输同样格式的数据,xml需要使用更多的字符进行描述。
2.流行的是基于json的数据传输。
3.xml的层次结构比json更清晰。

2.请说下3次握手和4次挥手

三次握手:

第一次握手:客户端发送第一个包,其中SYN标志位位1,ACK=0,发送顺序号sequence=X(随机int)。客户端紧促SKY发送状态,等待服务器确认。
	
第二次握手:服务器收到这个包后发送第二个包,其中包SKY、ACK标志位位1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1.此时服务器进入SYN接收状态。
	
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0,ACK=1,接收顺序号为ACK=Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。

四次挥手:

第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。

第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。

第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。

第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手。

3.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

建立连接时,ACK和SYN可以放在一个报文里来发送。
而关闭连接时,被动关闭方可能还需要发送一些数据后,
再发送FIN报文表示同意现在可以关闭连接了,
所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

4.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

两个存在的理由:

1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。
2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。

5.断开连接的时候客户端为什么需要等待2MSL时间?

保证客户端发送的最后一个ACK报文能够到达服务器,
因为这个ACK报文可能丢失,站在服务器的角度看来,
我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,
应该是我发送的请求断开报文它没有收到,
于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,
接着给出回应报文,并且会重启2MSL计时器。

6.servlet是单线程还是多线程?

Servlet是单实例多线程的。

7.Servlet的生命周期是怎样?

 Servlet 通过调用构造方法进行实例化,构造方法必须为无参构造方法。默认是在第一次被访问的时候构造对象。
  也可以在web.xml中通过<load-on-startup>N</load-on-startup>配置Servlet被创建的时机。
  (N为一个整数表示优先级,>=0表示在web服务器启动的时候创建,<0表示第一次访问时创建)
	- Servlet 实例创建完毕后立马通过调用 init()方法进行初始化,如果初始化失败抛出ServletException,Servlet对象将会被垃圾回收器回收。
	init初始化操作只会执行一次。初始化时机紧跟Servlet创建。
	- Servlet 调用service()方法来处理客户端的请求。
	- Servlet 通过调用 destroy()方法终止(结束)。
	- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

8.get请求与post的请求的区别是什么?

get:

1,参数拼接在url,不安全
2,只能是字符串类型
3,大小有限制2kb,速度快

post:

1,参数封装到请求体,安全
2,还可以是非字符串类型比如文件 
3,理论上大小没限制,速度慢

9.转发与重定向的区别?

转发:一次请求,返回200,地址栏没变化

重定向:二次请求,第一返回302,
第二次请求会使用第一次请求响应中的Location头信息地址进行访问。
第二次请求返回200或者304,地址栏会改变。

10.静态包含(指令)跟动态包含(动作)有什么区别?

  • 原理不同:
    ​ 静态包含:先合并再翻译
    ​ 动态包含:先翻译在包含

  • 最终编译成java文件的数目不同。
    静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。

  • 静态包含在两个文件中不能有相同的变量,动态包含允许

  • 语法不同:
    静态包含语法: <%@inclue file=“被包含的页面”%>
    动态包含语法: <jsp:include page=“被包含的页面”>

  • 参数传递不同 :
    静态包含不能向被包含页面传递参数
    动态包含可以使用jsp:param标签向被包含页面传递参数

11.JSP的内置对象有哪些?

jsp有九大隐式对象(内置对象)

1.request:HttpServletRequest对象,代表请求
2.response:HttpServletResponse对象,代表响应
3.out:JspWriter对象,代表输出
4.session:HttpSession对象,代表每个会话
5.application:ServletContext应用对象,代表整个应用程序
6.config:ServletConfig配置对象,代表配置文件中的信息
7.pageContext:PageContext对象页面上下文对象,包含页面信息
8.page:当前页面对象(this)(基本不使用)
9.exception:Throwable异常对象,包含jsp异常信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值