Java面试题(1)

1.说一下转发(Forward)和重定向(Redirect)的区别
答:①转发是服务器行为,重定向是客户端行为
②剩下的区别如下图:在这里插入图片描述
2. TCP 三次握手和四次挥手
在这里插入图片描述
简单示意图:
在这里插入图片描述

  • 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
  • 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
  • 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端

为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常。

第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常

第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常

所以三次握手就能确认双发收发功能都正常,缺一不可。

为什么要传回 SYN
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。


传了 SYN,为啥还要传 ACK
双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方(主动关闭方)到接收方(被动关闭方)的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。

TCP的四次挥手
示意图如下:
在这里插入图片描述
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

3.常见http状态码
在这里插入图片描述
HTTP请求、响应报文格式:
HTTP请求报文主要由请求行、请求头部、请求正文3部分组成
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成
详细内容可以参考:https://blog.csdn.net/a19881029/article/details/14002273

4. 为什么要使用索引?索引这么多优点,为什么不对表中的每一个列创建一个索引呢?索引是如何提高查询速度的?说一下使用索引的注意事项?Mysql索引主要使用的两种数据结构?什么是覆盖索引?

为什么要使用索引?

①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
②可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。
③帮助服务器避免排序和临时表
④将随机IO变为顺序IO
⑤可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

索引这么多优点,为什么不对表中的每一个列创建一个索引呢?
①当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
③创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

索引是如何提高查询速度的?
将无序的数据变成相对有序的数据(就像查目录一样)

说一下使用索引的注意事项
①避免 where 子句中对字段施加函数,这会造成无法命中索引。
(解释: 因为索引是加在字段上的,而不是加在字段所组成的函数上,例如索引加在x上,而不是加在f(x)上,所以你在where子句中用f(x)没有什么用,利用不到索引)

②在使用InnoDB时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键。(小疑问:????)

③将打算加索引的列设置为 NOT NULL ,否则将导致引擎放弃使用索引而进行全表扫描(解释: 因为索引的列是不能为null的,一旦该列中有值为null,那么就不能触发索引了,而采用全表扫描)

④删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 可以通过查询 sys 库的 chema_unused_indexes 视图来查询哪些索引从未被使用(解释: 因为维护索引需要时间开销,而且存储索引需要空间开销,所以建议删除长期未使用的索引)
⑤在使用 limit offset 查询缓慢时,可以借助索引来提高性能(解释: 一般limit begin counts 首先定位begin值,所以借助索引可以很快定位到begin)

5.线程间的几种通信方式知道不?
1、锁机制
互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。
读写锁:允许多个线程同时读共享数据,而对写操作互斥。
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
2、信号量机制:包括无名线程信号量与有名线程信号量

3、信号机制:类似于进程间的信号处理。

线程间通信的主要目的是用于线程同步,(所以线程没有像进程通信中用于数据交换的通信机制????括号里的有点不理解)。

6.简单介绍一下bean。知道Spring的bean的作用域与生命周期吗?
在这里插入图片描述

7.SpringMVC 原理了解吗?
在这里插入图片描述
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java全栈研发大联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值