前言:
String,StringBuilder,StringBuffer的区别是啥?这个面试题估计每个程序员都应该碰到过吧。依稀记得第一次面试的时候,面试官问我这个问题时,心想着这不是很简单吗。深入了解这个问题后,发现这里面并不简单,面试官的套路还是深啊!
面试官:你好,欢迎来面试,介绍一下自己吧。
你好,我是**, 来自 **,毕业于拖拉机学院,目前工作了2年,在 ** 公司做了一年的开发,做过的项目有。。。布拉布拉
然后双方对项目进行深入的讨论。。。
然后进行基础问答环节
下面挖坑套路来了
面试官:那你能说一下String,StringBuilder,StringBuffer到底有什么区别吗?
String的值是不可改变的,这就导致每次对String的操作都会生成新的String对象,不禁效率底下,而且浪费大量的内存空间;StringBuilder是可变类,任何对他指向的字符串的操作都不会产生新的对象,但单线程不安全;StringBuffer底层方法使用了synchronized关键字,线程比较安全,但效率较StringBuilder慢;在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
面试官:String类它可以被继承吗?
不可以,因为String类使用final关键字进行修饰,所以不能被继承,并且StringBuilder,StringBuffer也是如此都被final关键字修饰。
面试官:为什么String的是不可变的?
因为存储数据的char数组是使用final进行修饰的,所以不可变。
面试官:为什么String Buffer是线程安全的?
这是因为在StringBuffer类内,常用的方法都使用了synchronized 进行同步所以是线程安全的,然而StringBuilder并没有。这也就是运行速度StringBuilder > StringBuffer的原因了。
另外本人整理了21年面试题大全,包含spring、并发、数据库、Redis、分布式、dubbo、JVM、微服务等方面总结,下图是部分截图,需要的话私信我【Java】领取
面试官:刚才你说到了synchronized关键字 ,那能讲讲synchronized的表现形式吗?
-
对于静态同步方法,锁是当前类的class对象。
-
对于普通同步方法 ,锁是当前实例对象。
-
对于同步方法块,锁是Synchonized括号配置的对象。
面试官:能讲讲synchronized的原理嘛?
我傻了问得这么深的吗,面试官不简单啊
synchronized是一个重量级锁,实现依赖于JVM 的 monitor 监视器锁。主要使用monitorenter和monitorexit指令来实现方法同步和代码块同步。在编译的是时候,会将monitorexit指令插入到同步代码块的开始位置,而monitorexit插入方法结束处和异常处,并且每一个monitorexit都有一个与之对应的monitorexit。
任何对象都有一个monitor与之关联,当一个monitor被持有后,它将被处于锁定状态,线程执行到monitorenter指令时间,会尝试获取对象所对应的monitor的所有权,即获取获得对象的锁,由于在编译期会将monitorexit插入到方法结束处和异常处,所以在方法执行完毕或者出现异常的情况会自动释放锁。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
面试官:内心OS:竟然没问倒他,看来让他培训是没啥希望了,让他回去等通知吧 。
你的水平我这边基本了解了,我对你还是比较满意的,但是我们这边还有几个候选人还没面试,没办法直接给你答复,你先回去等通知吧。
我:好的好的,谢谢面试官,我这边先回去了。内心OS:好险好险,一个String差点被问倒,幸好面试前好好看了一下,不然今天就是面试惨案了。
最后:
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家,需要面试复习资料的朋友可以私信我【Java】。
阿里面试面试题:链接:https://pan.baidu.com/s/1ryi6EMUEjZvlaRGEnipryw
提取码:tn3g