目录
前言
在日常开发过程中,我们经常用到字符串,但是到具体应用的时候并不知道(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核心技术整理的资料集锦,需要领取的小伙伴可以 点我 免费领取 ,编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。
部分资料图片:
喜欢小编的分享可以点赞关注哦,小编持续为你分享最新文章 和 福利领取哦