摘要:在平时实际开发中,我通常使用向上转型的对象完成业务逻辑,这样我觉得能使对象中的耦合度降低,而且在代码重构的时候能够轻易切换实现类。
本文首发于cartoon的博客
转载请注明出处:https://cartoonyu.github.io/c...
对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
摘要:导读这两天的被一个名叫的项目霸榜了,项目中记录了一些题目。建议大家也花半个小时来做一做,以便查漏补缺。为方便大家能够更快的做题,而不把时间浪费在翻译上,我又花了几个小时把它们翻译成了中文,当然已经获得了作者授权。 导读 showImg(https://segmentfault.com/img/remote/1460000019496110?w=1514&h=452); 这两天的GitH...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
阅读 3330·2021-11-22 09:34
阅读 2809·2021-10-09 09:43
阅读 1336·2021-09-24 09:47
阅读 2170·2019-08-30 12:53
阅读 954·2019-08-29 14:00
阅读 3322·2019-08-29 13:17
阅读 2236·2019-08-28 18:00
阅读 1252·2019-08-26 12:00