Java String传递核心面试题及详细答案(真实面试版)_第1页
Java String传递核心面试题及详细答案(真实面试版)_第2页
Java String传递核心面试题及详细答案(真实面试版)_第3页
Java String传递核心面试题及详细答案(真实面试版)_第4页
Java String传递核心面试题及详细答案(真实面试版)_第5页
全文预览已结束

下载本文档

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

文档简介

JavaString传递核心面试题及详细答案(真实面试版)前言这套题目全部为一线企业高频面试原题,聚焦String参数传递机制、值传递本质、字符串不可变、拼接坑点、常量池与堆内存核心考点。答案摒弃书面化套话,以开发实际原理、面试答题话术编写,贴合真实面试官提问逻辑。面试题1:Java中String作为方法参数,是值传递还是引用传递?请说明原因标准答案Java中所有参数传递本质都是值传递,String也不例外,不存在引用传递。很多人会误以为String是引用传递,是因为混淆了「引用地址值」和「对象本身」的概念:1、对于基本数据类型:方法传递的是变量的原始值副本;2、对于String、对象、数组等引用类型:方法传递的是对象的引用地址副本,并不是对象本身。String作为参数传入方法时,会在方法栈中生成一个新的引用地址副本,这个副本和原变量指向同一个字符串对象。如果在方法内给参数重新赋值,只是修改了副本引用的指向,不会影响方法外部原变量的引用指向。代码示例佐证java

publicclassStringPassDemo{

publicstaticvoidchangeStr(Stringstr){

//仅修改方法内副本引用的指向

str="新字符串";

}

publicstaticvoidmain(String[]args){

StringoldStr="原字符串";

changeStr(oldStr);

//输出:原字符串

System.out.println(oldStr);

}

}结果解析:方法内修改str的值,外部oldStr完全不变,直接证明String是值传递(地址值副本传递)。面试题2:为什么方法内修改String参数,外部原字符串不会改变?和普通对象有什么区别?标准答案核心原因有两个:Java参数的值传递机制+String的不可变性。1、参数传递层面:方法接收的是原变量的引用副本,副本和原变量是两个独立的栈内存变量,只是初始指向同一个对象;2、String特性层面:String被final修饰,字符串一旦创建,对象内容无法修改。所有的赋值、拼接、替换操作,都不会修改原对象,只会新建一个字符串对象,并让方法内的副本引用指向新对象。而普通自定义对象(无final限制),方法内可以通过副本引用修改原对象的属性内容,因为引用指向的是同一个堆对象;但String无法修改原对象内容,只能更换引用指向,所以外部原变量完全不受影响。面试题3:下面代码的输出结果是什么?请详细解释执行过程java

publicclassStringTest{

publicstaticvoidmain(String[]args){

Strings1="abc";

change(s1);

System.out.println(s1);

}

staticvoidchange(Strings){

s=s+"def";

}

}标准答案输出结果:abc执行原理详解1、main方法中创建s1,指向字符串常量池中的「abc」对象;2、调用change方法,传递s1的地址副本,方法内变量s和s1初始都指向「abc」;3、执行s=s+"def",由于String不可变,不会修改原「abc」对象,而是在内存中新生成「abcdef」字符串对象,让方法内的局部变量s指向新对象;4、方法执行结束,局部变量s销毁,main方法中的s1引用指向从未改变,依旧指向「abc」,所以输出原值。面试题4:如果想在方法中修改外部的字符串值,有什么办法?为什么String不行?标准答案String本身无法通过方法参数修改外部值,因为不可变+值传递的双重特性限制。想要实现方法内修改、外部生效,有两种常用方案:方案1:方法返回新字符串,外部接收赋值(企业最常用)java

publicclassStringUpdateDemo{

publicstaticStringupdateStr(Strings){

returns+"后缀";

}

publicstaticvoidmain(String[]args){

Stringstr="测试";

str=updateStr(str);

System.out.println(str);//测试后缀

}

}方案2:使用可变字符串类(StringBuilder/StringBuffer)作为参数java

publicclassStringBuilderPassDemo{

publicstaticvoidappendStr(StringBuildersb){

sb.append("新增内容");

}

publicstaticvoidmain(String[]args){

StringBuildersb=newStringBuilder("原始");

appendStr(sb);

System.out.println(sb);//原始新增内容

}

}核心区别解释StringBuilder是可变类,方法内接收地址副本后,可直接修改堆中原有对象的内容,不需要新建对象、更换引用指向,因此外部变量可以感知到内容变化。面试题5:String传参和Integer传参有什么异同点?标准答案相同点1、两者都是值传递,传递的都是引用地址副本;2、两者都是不可变类(被final修饰,内部值无法修改);3、方法内重新赋值、修改数值/字符串,都只会新建对象,不会影响外部原变量。不同点1、底层缓存不同:Integer有[-128,127]缓存池,String有字符串常量池,缓存逻辑不同;2、修改场景不同:Integer仅支持数值修改,String支持拼接、替换、截取等多种内容操作,但本质都是新建对象。面试题6:Stringstr=newString("a")传参,和直接赋值"a"传参,传递效果一样吗?标准答案参数传递效果完全一致,没有任何区别。两者的区别仅在于内存创建方式:1、Stringstr="a":直接从字符串常量池获取对象,无堆对象;2、Stringstr=newString("a"):先在常量池创建/获取「a」,再在堆中新建一个String对象,底层指向常量池字符数组。但在参数传递时,都是传递变量的引用地址副本,无论指向堆对象还是常量池对象,值传递的机制、方法内的修改逻辑、外部变量的结果完全相同,不会改变传递特性。面试题7(压轴高频):简述String不可变性和参数值传递的关联,面试完整话术面试标准口述答案首先,Java所有参数都是值传递,String作为引用类型,传递的是引用地址的副本,不是对象本身。其次,String是final修饰的不可变类,内部字符数组私有且不可修改,一旦对象创建,内容永久固定。所以在方法中对String参数做赋值、拼接操作时,无法修改原对象,只能新建字符串对象,让方法内的副本引用指向新对象。而外部的原引用指向不变,因此外部字符串的值不会发生任何改变。这也是String传参无法修改原值的根本原因。高频面试总结(必背考

温馨提示

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

评论

0/150

提交评论