java面试题——2-5年后端开发常见面试题(四)(实际面试被问到)

目录

1、string和stringbuffer和stringbuilder的区别

2、MyBatis防止SQL注入的方法

3、JDK动态代理和CGLIB动态代理的区别?

4、动态代理和静态代理的区别

5、Spring中的动态代理是通过什么方式实现的?

6、Lombok的原理

7、spring循环依赖以及解决办法

8、spring在哪些情况下无法解决循环依赖问题?

9、java中的锁有哪些?

 10、mysql中的锁有哪些?

11、什么是mybatis?mybatis有哪些优缺点?

12、什么是脏读、不可重复读和串行化?mysql的四种事务隔离级别对应的解决了哪些问题?

mysql事务隔离级别(由低到高):

读已提交和可重复读的区别:

总结:


1、string和stringbuffer和stringbuilder的区别

  • String是一个长度不可变的字符序列,底层是一个被final修饰的char[]数组,所以说,任何对 String 类型进行改变的操作实际上都是重新生成了一个新的String对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。
  • StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储

  • StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储


2、MyBatis防止SQL注入的方法

MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

使用 #{} 可以有效的防止SQL注入,提高系统安全性。


3、JDK动态代理和CGLIB动态代理的区别?

  • JDK Proxy是通过拦截器加反射的方式实现的,只能对实现了接口的类生成代理,无需通过加载第三方类实现,实现和调用起来比较简单,JDK Proxy实现动态代理的核心是实现Invocation接口。
  • CGLib是第三方提供的工具,基于ASM实现的,无需通过接口来实现,它是通过实现子类的方式来完成调用的,性能比较高

JDK Proxy是Java语言自带的功能,Java对JDK Proxy提供了稳定的支持,并且会持续的升级和更新JDK Proxy,例如Java8版本中的JDK Proxy性能相比于之前版本提升了很多

动态代理常用实现方式是反射

动态代理是一种行为方式,而反射或ASM只是它的一种实现手段而已

反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象以及类对象中包含的属性及方法


4、动态代理和静态代理的区别

静态代理其实就是事先写好代理类,可以手工编写也可以使用工具生成,它的缺点是每个业务类都要对应一个代理类特别不灵活也不方便,于是就有了动态代理

动态代理的常见使用场景有RPC框架的封装、AOP(面向切面编程)的实现、JDBC的连接等


5、Spring中的动态代理是通过什么方式实现的?

Spring框架中同时使用了两种动态代理:JDK Proxy和CGLib

当Bean实现了接口时,Spring就会使用JDK Proxy

在没有实现接口时就会使用CGLib

我们也可以在配置中指定强制使用CGLib

只需要在Spring配置中添加

<aop:aspectj-autoproxy proxy-target-class="true"/>


6、Lombok的原理

Lombok的实现和反射没有任何关系,反射是程序在运行期的一种自省(introspect)能力,Lombok的实现是在编译期就完成了


7、spring循环依赖以及解决办法

在代码中,把两个bean或多个bean相互之间去持有对方的引用就会发生循环依赖,循环依赖会导致注入啊会出现死循环,这是spring出现循环依赖的原因。

循环依赖有三种形态:

第一种是互相依赖,a依赖b,b又依赖a,他们之间形成了循环依赖;

第二种是三者间依赖,也就是a依赖b,b依赖c,c依赖a,形成了循环依赖;

第三种是自我依赖,也就是说a依赖a,形成的循环依赖;

spring设计了三级缓存去解决循环依赖问题,当我们去通过getBean()去获取一个对象实例的时候,spring会先从一级缓存去找,一级缓存没找到就去二级缓存去找,如果一二级缓存都没找到,意味着这个bean还没有实例化,然后spring容器会去实例化这个bean。而这个初始化实例的bean呢放到二级缓存,三级缓存是存储代理bean,当调用getBean()方法的时候呢,发现目标bean需要代理工厂来创建,这个时候就会把创建好的实例保存到三级缓存,最终呢也会把复制好的bean同步到一级缓存


8、spring在哪些情况下无法解决循环依赖问题?

有四种情况下的循环依赖无法被解决:

第一种是多实例bean通过setter注入的时候,不能解决缓缓依赖问题;

第二种是构造器注入的bean的情况,不能解决缓缓依赖问题;

第三种是单例的代理bean通过setter注入的时候,不能解决缓缓依赖问题;

第四种是设置@DependsOn注解的bean,不能解决缓缓依赖问题;


9、java中的锁有哪些?


 10、mysql中的锁有哪些?

  • 从锁粒度上划分为行锁和表锁
  • 从实现上又分为共享锁和排它锁
  • 从思想上又分为悲观锁和乐观锁

通过版本号来进行更新的操作属于乐观锁,共享锁 & 排它锁都是悲观锁的具象实现

悲观锁:

悲观锁在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿这个数据就会阻塞直到它拿到锁

悲观锁适合并发写入操作多的场景,先加锁再进行写操作,能保证写操作的数据正确性

乐观锁:

乐观锁在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别的线程有没有更新过这个数据。

乐观锁的实现方式:CAS实现,Version版本号机制

乐观锁适合读操作多的场景,不加锁的特点能使其读操作的性能大幅提升


11、什么是mybatis?mybatis有哪些优缺点?


12、什么是脏读、不可重复读和串行化?mysql的四种事务隔离级别对应的解决了哪些问题?

  • 脏读:读到了其他事务未提交的数据
  • 不可重复读:事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  • 幻读:正在执行的事务 读取到了其他事务已提交的插入,比如原本读到的是N条数据,然后变成N+1条了

mysql事务隔离级别(由低到高):

  • 读未提交:什么都没解决,还是会出现脏读、不可重复读、幻读
  • 读已提交:解决了脏读,没有解决不可重复读、幻读
  • 读已提交指的是一个事务的更新操作在未提交之前,另外一个事务是读取不到同一数据更新后的结果,这就避免了脏读。读己提交会锁定当前正在读取的行的数据(写操作加写锁,读操作加读锁)

  • 可重复读:解决了脏读,不可重复读,但没有解决幻读
  • 可重复读是mysql事务默认的隔离级别。可重复读会锁定读取到的所有行直到事务结束,其他事务的更新操作只能等到事务结束之后才能进行。

  • 串行化:解决了脏读,不可重复读和幻读
  • 串行化是mysql事务最高的隔离级别,当然并发性能最低。指的是所有的事务操作依次顺序执行,事务只能一个接着一个执行,不能并发执行。可序列化对表进行加锁,可以有效避免脏读、不可重复读、幻读问题,但是效率比较低,通常会用其他并发级别加上相应的并发锁机制来取代它。

读已提交和可重复读的区别:

可重复读:读操作会锁定读取到的所有行直到事务结束,可重复读的锁粒度更大;

读己提交:读己提交会锁定当前正在读取的行的数据,读提交的锁粒度相对较小;

总结:

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大(事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低)。

对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为读已提交它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

91科技

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

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

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

打赏作者

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

抵扣说明:

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

余额充值