Java String 高频面试题及详细答案(真实面试版)_第1页
Java String 高频面试题及详细答案(真实面试版)_第2页
Java String 高频面试题及详细答案(真实面试版)_第3页
Java String 高频面试题及详细答案(真实面试版)_第4页
Java String 高频面试题及详细答案(真实面试版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaString高频面试题及详细答案(真实面试版)1.String属于什么数据类型?和基本数据类型有什么区别?答案:String是引用数据类型,不属于8种基本数据类型。核心区别:基本类型(int、char、byte等)直接存储数值在栈内存中,默认有固定默认值,没有对象概念;String是类(java.lang.String),本质是对象,数据存储在堆内存,栈中仅存储对象引用地址,默认值为null。补充:日常写的Stringstr="abc"是语法糖,底层依然是创建String对象。2.简述String的不可变性?为什么String是不可变的?答案:String的不可变指:字符串一旦创建,内容无法被修改,任何拼接、替换、截取操作,都不会改动原字符串,只会生成一个新的字符串对象。不可变的底层原因(JDK1.9前后有区别):JDK1.8及之前:String内部通过privatefinalchar[]value存储字符,数组被final修饰,意味着数组地址不可变,且没有提供任何修改数组内容的公开方法,保证内容无法篡改;JDK1.9及之后:改用privatefinalbyte[]value存储,通过编码压缩节省内存,依然是final修饰,保留不可变特性。额外关键点:final修饰数组,是地址不可变,不是数组内容不可变;String真正实现不可变,是final+私有属性+无修改API共同作用的结果。3.String不可变性的优缺点?实际业务中有什么应用?答案:优点:线程安全:不可变对象天然线程安全,多线程并发访问无需加锁,不会出现数据篡改问题;字符串常量池复用:因为不可变,相同字符串可以缓存到常量池,全局复用,大幅节省内存;作为HashMap键安全:字符串内容不变,hashCode值固定,不会出现存入后取值找不到的问题;安全性高:网络请求、数据库连接、密码等字符串数据不会被恶意修改。缺点:频繁修改字符串(循环拼接、大量替换)时,会不断创建新对象,产生大量内存垃圾,效率极低。业务应用:系统配置参数、用户账号密码、URL地址、集合键值、多线程共享文本数据。4.String、StringBuilder、StringBuffer的区别?场景怎么选择?答案:三者核心差异围绕可变性、线程安全、性能三点:类型可变性线程安全性能适用场景String不可变安全低(频繁修改差)字符串极少修改、常量定义StringBuilder可变不安全最高单线程、频繁拼接修改字符串StringBuffer可变安全(方法加锁)较低(锁消耗)多线程环境下字符串拼接修改选型口诀:不修改、定义常量:用String;单线程频繁拼接:优先StringBuilder;多线程并发拼接:用StringBuffer。5.字符串常量池是什么?作用是什么?答案:字符串常量池是JVM为字符串专门开辟的一块缓存空间,属于方法区(元空间)的一部分,用于存储字面量形式定义的字符串。核心作用:复用对象,节省内存:多个变量引用相同字面量字符串时,只会创建一个对象,共享同一个地址;减少对象创建开销:避免重复创建大量相同字符串对象,提升程序运行效率。存入规则:Stringstr="test":先去常量池查找,有则直接引用,无则创建并放入常量池;newString("test"):一定会在堆中创建新对象,同时会检查常量池,无则存入。6.Strings1="abc"和Strings2=newString("abc")区别?创建几个对象?答案:(1)Strings1="abc"直接使用字面量赋值,优先走常量池:常量池无"abc":创建1个常量池对象;常量池已有"abc":创建0个对象,直接复用。(2)Strings2=newString("abc")new关键字一定会在堆中创建对象,最多创建2个对象:第一步:字面量"abc",在常量池创建1个对象(无则创建,有则复用);第二步:new在堆内存创建1个新的String对象;核心区别:字面量赋值:引用指向常量池;new赋值:引用指向堆内存对象。7.String的==和equals()有什么区别?答案:==比较的是内存地址:判断两个字符串变量是否指向同一个对象;equals()比较的是字符串内容:String重写了Object的equals方法,逐个比对字符,只要内容一致就返回true。经典案例:java

Strings1="abc";

Strings2=newString("abc");

System.out.println(s1==s2);//false(地址不同)

System.out.println(s1.equals(s2));//true(内容相同)开发规范:判断字符串内容一致,一律用equals;判断是否为同一个对象才用==。8.intern()方法的作用?常用场景是什么?答案:intern()是String的本地方法,作用是主动将字符串放入常量池,并返回常量池中的引用地址。执行规则:如果字符串已在常量池存在,直接返回常量池引用;如果不存在,JDK1.8会将堆中该字符串的引用存入常量池,复用堆对象,不重复创建。使用场景:大批量重复字符串数据(如日志解析、数据导入),通过intern复用常量池对象,大幅降低内存占用。注意:不要随意乱用,常量池缓存过多数据会导致永久代内存溢出。9.为什么不建议在for循环中使用+拼接字符串?答案:因为String不可变,每一次+拼接,底层都会:创建一个新的StringBuilder对象;执行append拼接;通过toString()生成新的String对象;循环结束产生大量废弃对象,触发频繁GC,严重影响性能。正确写法:循环外手动创建StringBuilder,循环内append,循环结束再toString。10.空字符串""和null的区别?答案:null:表示没有对象,栈中有引用,堆中无任何内存地址,调用equals()、length()会直接报空指针异常;""空字符串:是真实存在的对象,内存已分配,字符长度为0,可以正常调用字符串所有方法,不会空指针。开发判空最佳实践:优先使用StringUtils.isEmpty()或StringUtils.isBlank(),同时兼容null和空字符串,避免空指针。11.Strings=newString("a")+newString("b")会创建几个对象?答案:最多创建5个对象,拆解如下:常量池对象"a"、"b"(2个);堆中newString("a")、newString("b")(2个);拼接底层newStringBuilder,最后toString生成新的"ab"堆对象(1个);重点:拼接后的"ab"不会自动存入常量池,仅存在堆中。12.String的hashCode()是如何实现的?为什么缓存hash值?答案:String底层缓存了hash值,定义了privateinthash变量,默认0。hash计算公式:s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]缓存逻辑:第一次调用hashCode()时计算并赋值,后续直接读取缓存值,不再重复计算。为什么用31?31是奇素数,哈希冲突概率低;31*i可以优化为(i<<5)-i,运算效率极高。13.为什么String适合做HashMap的key?答案:不可变:字符串创建后内容不变,hashCode值永久固定,不会因为对象内容变化导致哈希位置改变,避免存取值错乱;重写了equals和hashCode:保证内容相同的字符串hash值一致,符合HashMap键的匹配规则;缓存hash值:查询效率高,无需重复计算哈希。14.JDK1.9为什么要将String的char[]改为byte[]?答案:JDK1.8及之前使用char[]存储,char占2字节,但日常开发中绝大多数字符串都是单字节的拉丁字符、数字、英文符号,大量内存被浪费。JDK1.9改用byte[]存储,做了编码压缩优化:纯英文、数字字符:单字节存储,节省近50%内存;包含中文、特殊字符:双字节存储,兼容所有字符;同时保留final修饰,依然保证String不可变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论