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

下载本文档

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

文档简介

JavaString面试/笔试真题及详细答案(实战版)本次题目适配Java后端实习生、初级开发岗位笔试、面试,覆盖String基础特性、常量池、底层原理、常见坑点、equals与==、字符串拼接、高频编程题,所有答案贴合工作实战,通俗易懂。一、基础概念选择题(附解析)1.题目:String属于什么数据类型?下列说法正确的是()A.基本数据类型

B.引用数据类型

C.既是基本类型也是引用类型

D.不属于Java数据类型答案:B详细解析:Java中只有8种基本数据类型:byte、short、int、long、float、double、char、boolean。String是类(java.lang.String),属于引用数据类型,存储在堆内存,变量存储的是对象的内存地址引用,而非数据本身。2.题目:String类的修饰符特点,说法正确的是()A.可继承、可修改

B.final修饰,不可继承、内容不可变

C.final修饰,不可继承,但内容可修改

D.无final修饰,可以被继承答案:B详细解析:String类被final修饰,意味着该类不能被继承;同时String底层字符数组(JDK9+为字节数组)也被final修饰,一旦字符串对象创建完成,内部字符序列无法被修改,这就是字符串不可变特性。二、核心原理简答题(高频面试)1.简述String不可变的原理及实际好处参考答案:不可变原理:1.String类被final修饰,无法被继承,避免子类破坏其特性;2.JDK8及之前,底层存储字符的char[]数组被private+final修饰,外部无法访问和修改;JDK9及之后改用byte[]存储,依然具备不可变特性;3.所有对字符串的修改操作(拼接、截取、替换等)都不会修改原对象,而是重新创建一个新的字符串对象。实际好处:1.线程安全:不可变对象天然线程安全,多线程并发场景下无需加锁;2.支持字符串常量池:因为不可变,常量池可以缓存字符串,避免重复创建对象,节省内存;3.作为HashMap键值安全:字符串不可变,hashCode值固定,不会出现存储后查找不到的问题;4.避免数据篡改,参数传递更安全。2.说说String、StringBuilder、StringBuffer的区别及使用场景参考答案:1.线程安全性-String:不可变,线程安全;-StringBuffer:方法被synchronized修饰,线程安全,支持多线程并发操作;-StringBuilder:无锁,线程不安全,多线程下会出现数据覆盖、结果异常。2.性能-频繁修改场景:StringBuilder性能>StringBuffer>String;-String每次拼接都会创建新对象,大量拼接会产生大量废弃对象,造成内存浪费、GC频繁。3.使用场景-String:字符串极少修改,多用于常量定义、少量字符串赋值;-StringBuilder:单线程下频繁字符串拼接、修改(日常开发最常用);-StringBuffer:多线程环境下,需要并发修改字符串的场景。3.详细解释字符串常量池的作用,以及两种创建字符串方式的区别参考答案:字符串常量池是JVM为了节省内存、减少重复对象创建,在堆中开辟的一块专门存储字符串常量的区域。相同内容的字符串只会在常量池中存储一份,实现复用。两种创建方式区别:1.直接赋值:Strings="abc"优先去字符串常量池查找,若存在,直接引用池中对象;若不存在,在常量池创建对象并引用。只会创建0或1个对象。2.new关键字创建:Strings=newString("abc")首先检查常量池是否有"abc",没有则在常量池创建;然后强制在堆内存中新建一个字符串对象,最终变量引用堆中的新对象。最少创建1个对象,最多2个对象,开销更大。4.==和equals()在字符串比较中的区别参考答案:==:比较的是内存地址,针对基本类型比较数值,针对引用类型比较对象的引用地址是否是同一个。equals():String类重写了Object的equals方法,不再比较地址,而是逐一比较字符串的内容、字符序列是否完全一致。实战结论:日常开发中,判断两个字符串内容是否相等,必须使用equals();==仅用于判断两个字符串是否是同一个对象。拓展避坑:为避免空指针异常,推荐写法:"固定字符串".equals(变量字符串)。三、代码分析错题(笔试高频坑点)1.分析以下代码输出结果,并说明原因java

publicclassStringTest{

publicstaticvoidmain(String[]args){

Strings1="hello";

Strings2="hello";

Strings3=newString("hello");

System.out.println(s1==s2);

System.out.println(s1==s3);

System.out.println(s1.equals(s3));

}

}输出结果:true

false

true详细解析:1.s1和s2通过直接赋值创建,都指向常量池中的同一个"hello"对象,地址相同,==结果为true;2.s3通过new创建,指向堆中的新对象,和常量池对象地址不同,==结果为false;3.equals比较字符串内容,三者内容完全一致,结果为true。2.分析字符串拼接代码输出结果java

publicclassStringTest2{

publicstaticvoidmain(String[]args){

Strings1="a"+"b"+"c";

Strings2="abc";

System.out.println(s1==s2);

}

}输出结果:true详细解析:JVM编译期会对纯常量字符串拼接进行优化,直接将"a"+"b"+"c"编译为"abc",s1直接指向常量池的abc对象,和s2地址一致,所以结果为true。3.带变量拼接的代码输出分析java

publicclassStringTest3{

publicstaticvoidmain(String[]args){

Strings1="ab";

Strings2="b";

Strings3="a"+s2;

System.out.println(s1==s3);

}

}输出结果:false详细解析:拼接中包含变量s2,编译期无法确定最终结果,不会触发编译优化。底层会创建StringBuilder进行拼接,最终new出一个新的字符串对象,存放在堆中,和常量池中的s1地址不同,结果为false。四、高频编程笔试题目1.题目:手写代码实现字符串反转(两种方法)方法一:遍历字符数组反转(基础笔试常用)java

publicclassStringReverse{

//字符串反转方法

publicstaticStringreverse(Stringstr){

//空值和空字符串判断

if(str==null||str.length()==0){

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);

}

publicstaticvoidmain(String[]args){

System.out.println(reverse("abcdef"));

}

}方法二:StringBuilder反转(简洁实战写法)java

publicstaticStringreverse2(Stringstr){

if(str==null||str.isEmpty()){

returnstr;

}

returnnewStringBuilder(str).reverse().toString();

}2.题目:统计字符串中指定字符出现的次数java

publicclassStringCount{

//统计指定字符出现次数

publicstaticintcountChar(Stringstr,charch){

if(str==null||str.length()==0){

return0;

}

intcount=0;

char[]chars=str.toCharArray();

for(charc:chars){

if(c==ch){

count++;

}

}

returncount;

}

publicstaticvoidmain(String[]args){

Stringcontent="javastringinterview";

System.out.println("字符i出现次数:"+countChar(content,'i'));

}

}3.题目:去除字符串首尾空格,不使用自带trim方法java

publicstaticStringmyTrim(Stringstr){

if(str==null){

returnnull;

}

intstart=0;

intend=str.length()-1;

//跳过开头空格

while(start<=end&&str.charAt(start)==''){

start++;

}

//跳过结尾空格

while(start<=end&&str.charAt(end)==''){

end--;

}

returnstr.substring(start,end+1);

}五、进阶面试压轴题1.String的intern()方法作用是什么?工作原理?参考答案:intern()方法的核心作用是将字符串手动放入常量池,并返回常量池中的对象引用。工作原理:1.调用字符串对象的intern()方法时,JVM会去字符串常量池查找是否存在内容相同的字符串;2.如果存在,直接返回常量池中的对象地址;3.如果不存在,将当前字符串对象存入常量池,再返回池中引用;实战用途:大量重复字符串场景下,使用intern()可以将堆中重复对象复用为常量池对象,大幅节省内存,例如日志处理、

温馨提示

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

评论

0/150

提交评论