版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
String高频面试题及详细答案(实战版)本次整理全部为企业真实高频面试题,答案贴合工程实战、面试官评分标准,剔除书面化套话,适合笔试、一面、二面核心考核点,覆盖String底层原理、内存机制、常见坑点、代码实操、算法场景全维度考点。一、基础原理类面试题1.说说String的特性,为什么说String是不可变的?参考答案:String最核心的特性就是不可变性,同时它是被final修饰的类、线程安全、支持常量池缓存。首先从底层源码来看,JDK1.9之前,String底层是被final修饰的char数组,JDK1.9及以后改为byte数组,无论是哪种数组,核心两点决定了不可变:第一,存储字符的数组是被privatefinal修饰的,外部无法直接访问和修改;第二,String类被final修饰,不能被继承,杜绝了子类重写方法破坏结构的可能。很多人会有误区,觉得拼接、替换字符串是修改了原字符串,其实完全不是。当我们执行+=、replace、substring等操作时,不会修改原有字符串,而是会在内存中创建一个全新的字符串对象,返回新对象的地址,原对象内容始终不变。不可变性的好处:1.线程安全:多线程并发场景下,字符串无法被修改,不存在线程竞争问题;2.支持常量池缓存:相同字符串可以复用内存,节省堆空间;3.作为HashMap的key安全:哈希值固定,不会因为内容变动导致存取异常。2.String、StringBuilder、StringBuffer的区别?日常开发怎么选择?参考答案:三者核心区别集中在可变性、线程安全、性能三个维度:1.String:不可变字符串,每次修改都会生成新对象,频繁拼接会产生大量无用垃圾,性能最差;2.StringBuffer:可变字符串,底层数组可扩容,所有方法都加了synchronized锁,线程安全,但是加锁会带来性能损耗,多线程场景使用;3.StringBuilder:可变字符串,无锁、线程不安全,没有锁竞争开销,性能最好,单线程场景首选。开发选择规范:1.字符串几乎不修改、仅做赋值、查询、比较:直接用String;2.单线程下频繁拼接、修改字符串:优先StringBuilder;3.多线程并发拼接字符串、共享变量修改:使用StringBuffer。补充面试加分点:日常开发中99%的场景都是单线程,所以StringBuilder使用频率最高,除非明确多线程场景,否则不推荐用StringBuffer。3.String为什么要设计成不可变?如果可变会有什么问题?参考答案:设计不可变的核心目的是保证安全、提升性能、适配底层机制。如果String可变,会出现三个严重问题:1.常量池失效:字符串常量池的核心是复用对象,如果原有字符串可以被修改,所有引用该对象的变量值都会被篡改,造成业务混乱;2.HashMap键值异常:HashMap的key依赖字符串哈希值固定,如果字符串可变,修改内容后哈希值改变,会导致后续无法正常get、remove数据,出现内存泄漏、数据查询异常;3.线程安全问题:多线程同时修改同一个字符串对象,会出现并发修改异常、数据覆盖问题;4.安全风险:很多底层参数、配置信息、路径地址都是字符串类型,如果可被篡改,会引发权限、路径穿透等安全漏洞。二、内存与常量池高频题(面试重灾区)4.Strings1="abc"和Strings2=newString("abc")有什么区别?参考答案:两者最核心的区别是创建对象的数量、内存存放位置不同:1.Strings1="abc"直接在字符串常量池中创建对象。如果常量池已经存在"abc",不会新建对象,直接复用已有对象的地址;如果不存在,则在常量池创建一个对象。最多创建1个对象。2.Strings2=newString("abc")new关键字一定会在堆内存创建新对象,同时会先去常量池查找"abc":-常量池无"abc":常量池创建1个,堆中创建1个,一共2个对象;-常量池有"abc":仅在堆中创建1个新对象。核心结论:newString方式无论如何都会产生堆内存新对象,不会复用常量池堆对象,这也是==比较结果不同的根本原因。5.说说String常量池的机制,以及intern()方法的作用?参考答案:字符串常量池是JVM为了减少字符串重复创建、节省内存设计的缓存机制,存放所有字面量定义的字符串,全局可复用。intern()方法核心作用:主动将字符串对象放入常量池,并返回常量池中的对象地址。执行逻辑:先去常量池查找当前字符串内容,如果已经存在,直接返回常量池地址;如果不存在,将当前字符串存入常量池,再返回地址。实战场景:当我们通过new、字符串拼接生成大量重复字符串时,调用intern()可以复用常量池对象,大幅节省内存,避免堆内存溢出。6.下面代码的输出结果是什么?为什么?(经典坑点)代码案例:PlainText
Strings1="abc";
Strings2=newString("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));参考答案:输出结果:false、true解析:1.==比较的是对象内存地址:s1指向常量池对象,s2指向堆内存新对象,地址不同,所以返回false;2.equals重写了Object方法,比较的是字符串内容,两者内容都是abc,所以返回true。面试必背总结:字符串比较内容永远用equals,==只用于判断是否是同一个对象。7.字符串拼接的底层原理,为什么循环拼接不建议用+?参考答案:1.常量拼接(编译期优化)比如Strings="a"+"b"+"c",编译时会直接优化为Strings="abc",只会创建一个常量池对象,效率很高。2.变量拼接(运行期执行)如果是Strings=s1+s2,编译期无法确定结果,底层会默认创建StringBuilder对象,执行append拼接,最后toString返回新字符串。循环中用+拼接的致命问题:每一次循环都会新建一个StringBuilder、执行append、toString生成新字符串,循环次数越多,产生的临时垃圾对象越多,占用堆内存、触发频繁GC,性能极差。所以循环拼接必须手动创建StringBuilder,复用同一个对象,避免频繁创建销毁对象。三、高频代码坑点面试题8.null和空字符串""的区别?开发中如何优雅判空?参考答案:1.本质区别:null代表没有对象,地址为空;""代表存在字符串对象,但是内容为空,有内存地址。2.方法调用区别:null调用任何方法都会报空指针异常;空字符串可以正常调用equals、length等方法,length结果为0。优雅判空方案(开发标准写法):不推荐手动写if判断,容易漏判、代码冗余,优先使用工具类:1.mons.lang3.StringUtils:StringUtils.isEmpty()、StringUtils.isBlank();2.Spring工具类:org.springframework.util.StringUtils.hasText()。重点区分:isEmpty:判断null或空字符串,空格不算空;isBlank:判断null、空字符串、全空格字符串,日常参数校验首选。9.substring方法有没有坑?JDK不同版本有什么区别?参考答案:substring用于截取字符串,JDK1.7前后底层实现完全不同,存在明显内存坑点:1.JDK1.6:substring截取后,新字符串底层数组和原字符串共用同一个char数组,只是偏移量和长度不同。如果截取极小一部分字符串,原大字符串无法被GC回收,会造成内存泄漏;2.JDK1.7及以后:修复了该问题,截取后会新建数组、复制内容,原字符串可正常回收,不存在内存泄漏。开发建议:即使新版JDK无坑,复杂业务截取后如需长期缓存,可手动newString(),彻底隔离原对象。10.为什么HashMap的key推荐用String?参考答案:1.不可变性:String创建后内容不可修改,哈希值hashCode固定,不会出现存入和取出哈希值不一致的问题;2.重写了equals和hashCode方法:精准根据内容比较、计算哈希,满足HashMap键的规范;3.常量池复用:大量字符串key可以复用内存,节省空间;4.通用性强:参数、配置、业务标识大多为字符串类型,适配所有业务场景。四、算法实操面试题(字符串基础必考)11.手写代码:字符串反转(两种实现方式)参考答案(实战代码):PlainText
//方式1:StringBuilder反转(最简、推荐开发使用)
publicstaticStringreverse1(Stringstr){
if(StringUtils.isBlank(str)){
returnstr;
}
returnnewStringBuilder(str).reverse().toString();
}
//方式2:手动遍历字符数组反转(面试手写必会)
publicstaticStringreverse2(Stringstr){
if(StringUtils.isBlank(str)){
returnstr;
}
char[]chars=str.toCharArray();
intleft=0;
intright=chars.length-1;
while(left<right){
//交换左右指针字符
chartemp=chars[left];
chars[left]=chars[right];
chars[right]=temp;
left++;
right--;
}
returnnewString(chars);
}12.手写代码:判断字符串是否是回文字符串参考答案(双指针最优解法):PlainText
//回文:正读和反读完全一致
publicstaticbooleanisPalindrome(Stringstr){
if(StringUtils.isBlank(str)){
returntrue;
}
char[]chars=str.toCharArray();
intleft=0;
intright=chars.length-1;
while(left<right){
if(chars[left]!=chars[right]){
returnfalse;
}
left++;
right--;
}
returntrue;
}五、面试高频
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年生物材料评估测试试卷及答案
- 2026年智能软件开发专业技术开发技术评估测试试卷及答案
- 安全用药安全大班教案
- 围绕高考的营销方案(3篇)
- 宣传推广营销方案范文(3篇)
- 星球家园主题活动方案策划(3篇)
- 末端风盘施工方案(3篇)
- 校区升级营销活动方案(3篇)
- 楼层管道怎么施工方案(3篇)
- 2026-2027学年初中数学七年级下册(新教材)鲁教版(五四制)(新教材)1 认识二元一次方程组课时达标卷
- 2025年全国硕士研究生招生考试临床医学综合能力考试真题及答案
- 机动车检测站内审年度计划及实施细则
- 2026年3c低压成套开关设备考试题目及答案
- 中建八局在线测评考什么
- 华为合规新管控机制
- 投诉结果评价制度规范
- 2025气瓶充装单位气瓶充装安全风险日管控、周排查、月调度管理制度
- 2025年信用报告征信报告详版个人版模板样板(可编辑)
- 富士康te理论考试试题及答案解析(2025版)
- 小学家委会工作实务培训
- 风景名胜区规划
评论
0/150
提交评论