vlambda博客
学习文章列表

Java面试时,面试官常问的问题(七)



81. 简述 tcp 和 udp的区别?

tcp 和 udp 是 OSI 模型中的运输层中的协议。tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输。

两者的区别大致如下:

· tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;

· tcp 提供可靠的服务(数据传输),udp 无法保证;

· tcp 面向字节流,udp 面向报文;

· tcp 数据传输慢,udp 数据传输快;

82. tcp 为什么要三次握手,两次不行吗?为什么?

如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

83. 说一下 tcp 粘包是怎么产生的?

tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:

· 发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;

· 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。

84. OSI 的七层模型都有哪些?

· 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

· 数据链路层:负责建立和管理节点间的链路。

· 网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。

· 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。

· 会话层:向两个实体的表示层提供建立和使用连接的方法。

· 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。

· 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。

85. get 和 post 请求有哪些区别?

· get 请求会被浏览器主动缓存,而 post 不会。

· get 传递参数有大小限制,而 post 没有。

· post 参数传输更安全,get 的参数会明文限制在 url 上,post 不会。

86. 如何实现跨域?

实现跨域有以下几种方案:

· 服务器端运行跨域 设置 CORS 等于 *;

· 在单个接口使用注解 @CrossOrigin 运行跨域;

· 使用 jsonp 跨域;

87. 说一下 JSONP 实现原理?

jsonp:JSON with Padding,它是利用script标签的 src 连接可以访问不同源的特性,加载远程返回的“JS 函数”来执行的。

设计模式

88. 说一下你熟悉的设计模式?

· 单例模式:保证被创建一次,节省系统开销。

· 工厂模式(简单工厂、抽象工厂):解耦代码。

· 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

· 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。

· 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

· 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

89. 简单工厂和抽象工厂有什么区别?

· 简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。

· 工厂方法:用来生产同一等级结构中的固定产品,支持增加任意产品。

· 抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族。

Spring/Spring MVC

90. 为什么要使用 spring?

· spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。

· spring 提供了事务支持,使得事务操作变的更加方便。

· spring 提供了面向切片编程,这样可以更方便的处理某一类的问题。

· 更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

91. 解释一下什么是 aop?

aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。

92. 解释一下什么是 ioc?

ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。

简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。

93. spring 有哪些主要模块?

· spring core:框架的最基础部分,提供 ioc 和依赖注入特性。

· spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。

· spring dao:Data Access Object 提供了JDBC的抽象层。

· spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。

· spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。

· spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。

94. spring 常用的注入方式有哪些?

· setter 属性注入

· 构造方法注入

· 注解方式注入

95. spring 中的 bean 是线程安全的吗?

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。

· 有状态就是有数据存储功能。

· 无状态就是不会保存数据。


Java面试时,面试官常问的问题(七)

扫描二维码

获取更多精彩

  嗨码歌