国内Java面试总是问StringBuffer,StringBuilder区别是啥?档次为什么这么低?

目录

前言

StringBuffer悠久的历史

字符串

大厂面试题的开头

阿里P5-P7知识结构

最后


前言

在日常开发过程中,我们经常用到字符串,但是到具体应用的时候并不知道(String StringBuffer StringBuilder)在什么情况下会应用到;我们今天就深入浅出的说一下字符串、在什么情况下会用到。

StringBuffer悠久的历史

StringBuilder 问题档次并不低,如果仔细思考的话,这是一个历史悠久,并且至今仍在困扰很多程序员的问题。这是个字符串内存管理策略问题。几十年前 在C和Pascal的时代,就有字符串存储形式 是 \0 结尾还是 长度+内容的争论,这个问题严重影响了API的设计,内存的管理,甚至程序架构。

字符串

字符串是一种非常常用的 生命周期通常很短的对象,而且它的size是不固定的,长度为 1 或 1GB都有可能,导致内存管理非常麻烦复杂。

  • 用长度+内容表示,每个串都要额外付出4个字节,用\0结尾吧,算长度就很麻烦,万一结尾忘了\0就要崩溃,选哪个好?
  • 字符串的长度放哪里,放到起始指针的位置,还是起始指针的前面
  • 如果放前面,那么字符串起始指针和内存块起始不一致怎么解决?
  • 字符串拼接的时候把源串复制到目标串结尾,那么目标串剩余内存不够怎么办,重新分配要多一次赋值,频繁拼接性能有问题怎么办?
  • 函数返回值如果是字符串,那么这个串是调用者分配内存还是被调用者分配,谁来负责释放。
  • 如果调用者分配,那么调用者怎么知道字符串将有多长。
  • 频繁分配释放大小各异的字符串,会不会导致内存碎片化?
  • 对于小字符串是分配在堆上还是栈上?
  • 怎么把常量串和变量串分别处理?
  • 如果设计面向对象的字符串,字符串加法怎么定义,是在原来对象上加,还是生成一个新对象
  • 如果每加一次都生成新对象会不会导致构造析构太频繁
  • 如果是托管语言会不会太频繁GC
  • 要不要设计单独的辅助类来解决字符串拼接问题
  • 那这个辅助类怎么设计,要不要考虑线程安全?
  • 如果考虑线程安全的话,怎么兼顾性能?

你把这些问题都思考透彻了,再遇到问此类问题的面试官,就给他上上课,保证他懵逼。

大厂面试题的开头

大厂开场的面试题一般就是这么朴实无华且枯燥。我们的一位老师阿里P8,面P6/P7上来第一个问题就是这个:Java中操作字符串都有哪些类?它们之间有什么区别?

答案是这样的:

String,StringBuffer,StringBuilder。区别String声明的是不可变的对象,每次操作必然产生一个新的对象;StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder;StringBuffer具备线程安全性;

知道有什么,知道为什么,知道怎么用缺一不可,否则就等着面试官的灵魂拷问吧。

这里面还有两个加分项:

1.知道StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。

2.String的源码解读:final修饰-->不可变-->每次操作都会生成新的String对象;对比StringBuffer和StringBuilder-->值可变,拼接字符串开销。

这只能算开场热身,接下来才是重点。

面试官会问你线程的安全性。可以直接查源码,找synchronized、线程锁,得到结论:StringBuffer具备线程安全性。

你以为要结束了?接着问:既然StringBuffer具备线程安全性,迭代开销又小,那我们在工程实践中是不是首选StringBuffer就可以了?这就是考验你的批判性思维了。

所以这一波你以为你在第三层,其实面试官在第五层,老千层饼了。

阿里P5-P7知识结构

当然不同级别的面试,要求也不一样。所以被问到答不上来时,也不要觉得面试凉了,这可能只是面试官在确定你的考察级别。以阿里P5-P7来看,要求的知识结构大概是这样:

P5对应校招级别:Java语言高级特性简单来说就是教科书不怎么讲的东西,比如并发、算法线程、模板使用等等;关系数据库,索引怎么建,索引算法是什么,怎么调优,从百万到亿级数据量之间要做些什么工作;面向对象/设计模式则一般通过简历上的项目来了解。

P6是社招起步职级:面试一般就是抓住简历中的项目,不断深挖技术,主要看你是不是真的做过和理解。

P7技术专家:高可用架构、JVM原理和优化,这两个国内与国外差异比较大,国内非常重要所以是面试重点关注内容。用过Spring cloud的话,面试官会跟你深入沟通一番;如果能再懂点云计算,那么这个P7含金量就比较高了。

最后,面试中你的每一次回答都要珍惜,每一句话都要斟酌。你要告诉面试官:你真的很专业。

最后

感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

文章到此就结束了!

最后来自小编的福利

以下是小编整理的一份大厂真题的面试资料,以及2020最新Java核心技术整理的资料集锦,需要领取的小伙伴可以 点我 免费领取 ,编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。

部分资料图片:

喜欢小编的分享可以点赞关注哦,小编持续为你分享最新文章 和 福利领取哦

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值