资讯专栏INFORMATION COLUMN

JAVA面试题(43)

Zachary / 1699人阅读

摘要:在平时实际开发中,我通常使用向上转型的对象完成业务逻辑,这样我觉得能使对象中的耦合度降低,而且在代码重构的时候能够轻易切换实现类。

    本文首发于cartoon的博客
    转载请注明出处:https://cartoonyu.github.io/c...

java

对synchronized的了解

java的一个关键字,用于重量级锁的设定

利用synchronized关键字,可以实现对互斥资源的访问

作用范围

普通方法,锁的粒度为当前对象

静态方法,锁的粒度为当前类的class对象

代码块,锁的粒度为括号内使用的对象

多线程的同步机制

使用同步代码块synchronized

通过标志位轮询访问临界资源

通过Condition以及lock对资源的锁定以及释放

通过阻塞队列BlockQueue(生产者/消费者)

threadLocal的概念以及使用场景

每个线程都能拥有该变量的独立副本

内部通过ThreadLocalMap进行值的存储以及读取

初始容量为16

负载因子为2/3

通过再hash法解决hash冲突

final,finally,finalize的区别

final为不可变修饰词,用于声明属性,方法或类不可变

finally为异常捕获机制一部分,总是会被执行。若try或catch有return语句,finally早于此return语句执行

finalize为Object方法,调用此方法可以实现资源的回收,但是回收时间由JVM决定

java注解的作用

生成文档

完成特定的标识(@Service等)

在编译时进行格式检查(@Override)

java集合间的区别

set与list都只含单个元素,而Map含有key-value对

Map将entry数组置为null,就是set,所以set内元素是无序的,list元素是有序的

BIO NIO AIO的区别

BIO

同步阻塞

线程阻塞进行运算后返回结果

NIO

同步非阻塞

请求共用一个线程进行处理

线程会直接返回结果到请求

AIO

异步非阻塞

线程处理后会通过回调返回结果

java反射机制的理解

作用

在程序运行中,动态获取对象所属类,属性以及方法等信息

在程序运行时,动态改变对象属性

动态代理以及静态代理

jvm

怎么判断对象是否可回收?

引用计数法

可达性分析算法(GC ROOT)

java内存区域划分

运行时数据区域

线程共享

方法区

线程隔离区

虚拟机栈

本地方法栈

程序计数器

数据库

MyBatis分页方式以及区别

逻辑分页

数组分页

RowBounds分页

物理分页

sql分页

拦截器分页

数据库事务特性以及隔离级别

特性

原子性(Atomicity)

事务执行结果是一致的,成功或者回滚

一致性(Consistency)

事务执行前后数据库状态不受影响

隔离性(Isolation)

事务间操作相互独立

持久性

事务执行产生的结果是永久存储下来的

隔离级别

read uncommitted

读取事务未提交的数据

read commited

多次查询某一数据结果不一致

repeatable

同时修改同一元素造成事务提交结果发生偏差

serializable

事务的顺序执行

redis的数据类型以及底层数据结构

string

通过DDS(简单的动态字符串)实现

DDS的实现通过双端链表实现

hash

压缩列表(数据量较小)

key-value对少于512个且所有键对大小都要小于64字节

散列表

链地址法解决冲突

set

有序数组

数据都是整数

元素个数不超过512个

散列表

list

压缩列表

双循环链表

所有数据大小小于64字节

数据个数小于128个

有序集合

压缩列表

类似于数组,存储空间是连续的,但是元素所占空间不唯一

双循环链表

缓存穿透的概念,解决方法

缓存穿透是指请求访问不存在的key,请求穿透到DB,流量大会造成DB崩溃

解决方法

采用布隆过滤器或者BitMap对请求进行过滤

缓存雪崩的概念,解决方法

大量key设置统一过期时间,造成瞬间DB访问量过大

解决方法

key的过期时间用随机数进行设置

缓存击穿的概念,解决方法

存在key在缓存失效的瞬间被大量请求访问,造成DB请求量大

解决方法

设置短期key替代原始key

key再生成后删除短期key

spring

AOP,IOC的概念

AOP

AOP面向切面编程,它将原本纵向的程序看作成一个个切面的组合,是OOP的补充

动态插入执行逻辑到原有执行流程中

通知(Advice):具体实现逻辑

连接点(JoinPoint):使用通知的位置

切入点(PointCut):指定使用通知的连接点位置

切面(Aspect):通知与切入点集合

引入(introduction):添加新方法属性到现有类中

目标(target):被通知的对象

代理(proxy)

静态代理

动态代理

织入(weaving):将切面引用到目标对象生成代理对象的过程

IOC

我把IOC称作为控制反转或者依赖注入,IOC是Spring的核心思想,它使调用者不用管理对象的生存周期以及具体实现,能够更加注重于业务逻辑的实现。

在平时实际开发中,我通常使用向上转型的对象完成业务逻辑,这样我觉得能使对象中的耦合度降低,而且在代码重构的时候能够轻易切换实现类。

Spring bean的作用域

singleton

prototype

session

request

global session

Spring bean是线程安全吗?

prototype,request每次被调用都会创建新对象,不存在线程问题

singleton,session,globalSession会造成线程间竞争,无状态bean是线程安全的,有状态beanSpring通过ThreadLocal进行解决

spring mvc的执行流程

请求通过http到达后端,由DispatcherServlet进行分发

DispatchServlet通过HandlerMapping查找处理的Controller,中间或者会有过滤器等进行处理

如果在查找过程中发生错误,HandlerExceptionResolver会返回一个HandlerExecutionChain对象到DispathchServlet

请求正确分发到Controller,Controller调用Service以及Repository等进行处理,调用RequestAndViewNameResolver处理后返回ModelAndView对象到DispatchServlet

DispatchServlet根据返回的ModelAndView对象,将对象交给ViewResolver组件进行视图的渲染,如果在语言上有特殊要求,渲染会调用LocaleResolver以及ThemeResolver进行国际化的适配

网络

Session与cookie的区别

cookie存储在客户端,session存储在服务器

cookie只能存储字符串,session可以存储任意对象

cookie的存储大小受客户端影响,大小为4KB,session存储大小不受影响

后端获取cookie通过http报文中的cookie字段获取,session则通过cookie中的sessionId标识寻找

session的工作原理

session是存储在服务器端的一种标识客户端的数据结构

用户请求到达后台,后台检测是否有sessionId字段的存在

有的话,校验字段是否合法

没有的话,创建新session并返回对应sessionId到客户端

TCP与UDP区别

TCP面向连接,UDP不面向连接

TCP有拥塞控制,UDP没有拥塞控制

TCP资源开销大,UDP资源开销小

TCP只支持一对一,UDP支持一对多

TCP提供可靠传输,UDP尽可能交付

TCP面向字节流,UDP面向报文

tcp粘包的原因以及解决办法

原因

不同数据包在到达接收方时首尾部粘在一起

解决方法

在每个tcp报文首部添加报文长度

在报文的首部或者尾部设置特殊的符号位标识

tcp的三次握手与四次挥手

三次握手(连接过程)

一次握手(客户端发起)

创建TCB

发送SYN=1,seq=x

进入SYN-SENT

二次握手(服务器发起)

发送ACK=1,syn=1,ack=y+1,seq=x+1

进入SYN-RCVD

三次握手(客户端发起)

发送ACK=1,seq=x+1,ack=x+1

进入ESTABLISHED

四次挥手(结束连接过程)

一次挥手

客户端发送FIN=1,seq=u为内容的请求报文

客户端进入FIN-SENT-1状态

二次挥手

服务器端发送ACK=1,seq=v,ack=u+1为内容的确认报文

服务器端进入CLOSE_WAIT

客户端进入FIN-SENT-2状态

三次挥手

服务器端发送FIN=1,seq=w,ACK=1,ack=u+1为内容的释放报文

服务器端进入LAST_ACK状态

四次挥手

客户端发送ACK=1,ack=w+1,seq=u+1为内容的确认报文

客户端进入TIME_WAIT状态,等待2MSL后关闭连接

服务器端接受报文后关闭连接

设计模式

抽象工厂与简单工厂的区别

抽象工厂定义创建产品的大概流程,子工厂通过继承抽象工厂负责具体产品的创建,产品种类的增加不需要改变抽象工厂的代码逻辑

简单工厂负责具体产品的创建,产品种类的增加需要改变创建的逻辑

算法

快速排序实现

主要采用分治的思想

定义左右指针遍历元素(左右指针的初始值为边界)

循环遍历数组(左指针小于右指针)

循环遍历左指针直到元素大于右指针指向的元素

交换左右指针的元素值

循环遍历右指针直到元素小于小指针指向的元素

交换左右指针的元素值

返回左指针的值作为中线

分别递归中线左右,依据2,3的步骤进行处理

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75496.html

相关文章

  • [译]送你43JavaScript面试

    摘要:导读这两天的被一个名叫的项目霸榜了,项目中记录了一些题目。建议大家也花半个小时来做一做,以便查漏补缺。为方便大家能够更快的做题,而不把时间浪费在翻译上,我又花了几个小时把它们翻译成了中文,当然已经获得了作者授权。 导读 showImg(https://segmentfault.com/img/remote/1460000019496110?w=1514&h=452); 这两天的GitH...

    tommego 评论0 收藏0
  • 前端面试总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    pumpkin9 评论0 收藏0
  • 前端面试总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    Carson 评论0 收藏0
  • 前端面试总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    muzhuyu 评论0 收藏0

发表评论

0条评论

Zachary

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<