java后端经典面试题

tcp的三次握手和四次挥手

三次握手

第一步:client 发送 syn 到server 发起握手;
第二步:server 收到 syn后回复syn+ack给client;
第三步:client 收到syn+ack后,回复server一个ack表示收到了server的syn+ack

四次挥手过程分析

第一次:客户端请求断开FIN,seq=u
第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v
第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1
第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1

为什么三次握手和四次挥手?

三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里
四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号

确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。

ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

FIN:结束标志,用于释放连接,为1表示关闭本方数据流

为什么需要tcp的三次握手
client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”
–摘自谢希仁版《计算机网络》

mybatis的一级缓存和二级缓存
什么叫缓存

    将数据存放在程序内存中,用于减轻数据查询的压力,提升读取数据的速度,提高性能。

一级缓存

■ 两个级别

    SqlSession级别的缓存,实现在同一个会话中数据的共享

    Statement级别的缓存,可以理解为缓存只对当前执行的这一个Statement有效,执行完后就会清空缓存

■ 一级缓存的生命周期和SqlSession一致

■ 设置为SqlSession级别的缓存,当执行insert/update/delete操作或close之后,缓存清空

■ MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement

二级缓存

■ SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量

■ 存储作用域为Mapper的namespace级别,并且如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中

■ 可自定义存储源,如 EHCache(分布式缓存框架)

■ 当开启缓存后,数据的查询执行的流程就是二级缓存-> 一级缓存 -> 数据库

■ 不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率

■ MyBatis的二级缓存不适应用于映射文件中存在多表查询的情况,如果多个映射文件对应的Sql操作都使用的是同一块缓存,那么缓存的粒度就变粗了,多个Mappernamespace下的所有操作都会对缓存使用造成影响。

springIOC实现原理
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合,具体参考源码。

spring和springmvc的区别
Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。

springmvc和spring boot的比较
spring在刚开始的时候使用工厂模式(DI)和代理模式(AOP)解耦应用组件,进而开发出适用于Web开发的SpringMVC,在实际开发过程当中会使用到很多样板代码,就开发出了懒人版的SpringBoot;
区别:

1、Spring MVC提供了一种轻度耦合的方式来开发web应用。Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

2、Spring Boot实现了自动配置,降低了项目搭建的复杂度。众所周知Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。

@component @bean区别
两个注解的作用:

@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。

@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。

两者的目的是一样的,都是注册bean到Spring容器中。

@Component被用在要被自动扫描和装配的类(@AutoWired)上。

@Bean主要被用在方法上,来显式声明要用生成的类。

spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean。
完成这两个动作有三种方式,一种是使用自动配置的方式、一种是使用JavaConfig的方式,一种就是使用XML配置的方式。
在自动配置的方式中,使用@Component去告诉Spring,我是一个bean,你要来管理我,然后使用@AutoWired注解去装配Bean(所谓装配,就是管理对象直接的协作关系)。然后在JavaConfig中,@Configuration其实就是告诉spring,spring容器要怎么配置(怎么去注册bean,怎么去处理bean之间的关系(装配))。那么久很好理解了,@Bean的意思就是,我要获取这个bean的时候,你spring要按照这种方式去帮我获取到这个bean。

@Bean的用途则更加灵活

当我们引用第三方库中的类需要装配到Spring容器时,则只能通过@Bean来实现

总结:@Component和@Bean都是用来注册Bean并装配到Spring容器中,但是Bean比Component的自定义性更强。可以实现一些Component实现不了的自定义加载类。

抽象类和接口的区别
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是“is-a”关系,interface表示的是“has-a”关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法(jdk1.8中新增了default关键字,可以使接口有自己的默认的实现类)。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值,抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
6.接口中的方法默认都是 public,abstract 类型的。抽象类中方法可以有public、protected和default这些修饰符
7.抽象类可以有构造器,接口不能有构造器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值