一个阿里二面面试官必问的问题

你好,我是吴计可师,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累


我以前阿里的主管二面面试官,给一面面试官培训技巧的时候,分享一个他面试必问的一个题:

String,Stringbuffer,Stringbuilder的区别?

我们先就我们的知识解答,然后我们来继续分享他为什么必问这个问题?


01
String


定义:String 是不可变的字符串对象,所有的字符串操作(如拼接、修改)都会生成新的字符串对象,而原来的字符串对象不会改变。

特点:

  • 不可变性:字符串一旦创建,其内容不可更改。

  • 存储位置:字符串常量池,能够提高内存利用率。

  • 操作效率:由于需要不断创建新对象,频繁修改字符串会导致较低的效率。

适用场景:

  • 适用于字符串内容较少且不会频繁改变的情况,如常量声明、少量拼接操作等。

代码示例:

String str = "Hello";str = str + " World"; // 创建了新的字符串对象,旧对象被垃圾回收。


02
StringBuffer


定义StringBuffer 是一个可变的字符串类,适合多线程环境下使用,线程安全。

特点

  • 可变性:内容可以动态修改,不会生成新的对象

  • 线程安全:内部方法通过 synchronized 关键字保证线程安全。

  • 操作效率比 String 高效,但由于线程安全机制开销,性能略低于 StringBuilder

  • 适用场景

    • 多线程环境下需要频繁修改字符串的情况。

代码示例:

StringBuffer sb = new StringBuffer("Hello");sb.append(" World"); // 修改了原对象内容。


03
StringBuilder


定义:StringBuilder 也是一个可变的字符串类,功能和 StringBuffer 类似,但它是非线程安全的,效率更高。

特点

  • 可变性:内容可以动态修改。

  • 非线程安全:不适用于多线程场景。

  • 操作效率:比 StringBuffer 和 String 都高。

适用场景

  • 单线程环境下需要频繁修改字符串的情况。

代码示例:

StringBuilder sb = new StringBuilder("Hello");sb.append(" World"); // 修改了原对象内容。


04
对比总结



选择建议

  • String:适用于字符串不会改变的场景,如声明常量或进行少量拼接。

  • StringBuffer:适用于多线程环境下需要频繁操作字符串。

  • StringBuilder:适用于单线程环境下需要频繁操作字符串。

根据具体需求选择合适的类,可以有效提升程序性能并简化代码开发。


05
面试技巧


如果到这儿就完了,我相信很多人都会嗤之以鼻,就这?...

当然不会,下面我讲讲他说“为什么我喜欢问这个简单的问题”?


5.1 问这个问题,不会让候选人冷场

几年以前,还不至于像现在这种很多的八股文刷题。很多面试官问一个问题,如果很难或者正好是候选人的知识面的盲区,这时候选人可能有一定的心理压力,可能会更加紧张,导致后面发挥都不好。而这个问题,多多少少都可能会答上来一点。候选人心里压力就小很多,“哎,这个问题我会”,这样候选人的水平也会发挥的比较好。


5.2 这个问题的引申问题非常的多

面试官考察候选人,目的不是为了考倒候选人,而是挖掘一个候选人的能力极限在哪儿(当然也并不是每个面试官都能做到)。

候选人多多少少能答上来一点以后,就根据这个候选人回答的问题进行引申,挖掘这个候选人的能力极限。引申的点可能就是上面我标注过的一些内容了。

比如

线程安全:

  • 线程安全有哪些保证手段

  • synchronized关键字,底层实现,各个版本升级内容,锁升级,锁原理,cas等

  • volatile关键字,可见性问题,原子性问题,内存屏障,内存回刷,JMM等

  • 多线程

  • 线程池

jvm:

  • String为常量的话,内容放到哪个区,什么时候回收等等

  • 然后引出jvm其他相关问题

日常开发中注意事项:

  • for循环内的字符串拼接

  • 日志打印拼接,日志级别判断等

  • 性能优化,StringBuffer比StringBuilder性能弱多少

等等可能还能引申出更多的问题,这里就不展开了,大家也可以留言引申。


总结,现在很多面试官都是这种由浅入深,直到候选人回答不上来再终止,这种面试的方式可以很好的挖掘出候选人的真实水平,也依赖这个面试官的面试水平。当然也有一些完全聊不下去的面试官,如果你也有相同的经历可以留言给大家分享。


今天内容就分享到这儿,喜欢的可以点赞关注,你的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海



喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


谈谈id那些事(四)——雪花 ID(Snowflake ID)


谈谈id那些事(三)——阿里巴巴的 TDDL的ID生成


面试常被忽略的问题——内存区域划分


Java类加载过程详解