更新时间:2020-08-06 15:54:16 来源:极悦 浏览2095次
在Java面试中,字符串相关的知识是面试者比较青睐的,特别是在不同的情况下到底创建了几个对象,很多人理解的并不透彻,例如String str=new String("abc")为什么会创建两个对象,很多人只是知道,但是不知道为什么,接下来我已一个全面的例子作为开场,透彻的介绍String。
掌握下面的几点,所有的字符串面试题就不在是什么问题了:
注:本文以JDK8说明,至于JVM在每个版本的变化会在JVM面试库中详细介绍,在这就不展开了。
第一点:字符串创建有两种方式:字面量和利用new关键字
//1:字面量创建字符串对象
String str1 = "abc";
//2:利用new关键字创建字符串对象
String str2 = new String("abc");
第二点:字符串使用非常的频繁,从空间和性能方面考虑,JVM实例化字符串时进行了优化:添加了字符串常量池。
第三点:字符串常量池中的内容是类加载完成以后创建的,而字符串常量池保存的是字符串对象的引用,具体实例对象存放在堆中。
第四点:如果只是字面量进行拼接,JVM会将它们优化成一个字面量。
String str = "a"+"b";
//JVM会对上面的拼接进行优化,优化后
String str = "ab";
第五点:如果拼接中存在字符串变量,JVM会将它们优化成StringBuilder进行拼接,然后通过StringBuilder.toString()获取。
String str1 = "ab";
String str2 = str1+"c";
//上面字符串拼接存在字符串变量str1,JVM会对其优化
String str1 = "ab";
StringBuilder sb = new StringBuilder();
sb.append(str1).append("c");
String str2 = sb.toString();
第六点:new关键字会在堆上创建一个新的对象。
第七点:intern()方法:返回常量池该字符串的引用
intern的作用:
1:如果字符串常量池中存在字符串对象的引用,则直接返回这个对象的引用
2:如果字符串常量池中不存在字符串对象的引用,则首先在堆中创建对象,然后将这个对象的引用存放在常量池中。
上面的这七点如果真正掌握了,我相信下面的面试就很容易了。
面试1:下面的一句代码创建了几个对象
String str = new String("abc");
答案:创建了两个对象。
解析:此题主要考察了第三点和第六点。
1)创建的第一个对象(第三点):在类加载时,首先判断字符串常量中是否存在"abc"对象的引用,没有则创建一个"abc"对象,然后把这个对象的引用存放在字符串常量池中。
2)创建的第二个对象(第六点):new关键字会在堆中创建一个新的对象。
面试2:下面的代码会输出什么
String str1 = "abc";
String str2 = "a"+"b"+"c";
String str3 = new String("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);
答案:true,false
解析:此题主要考察了第三点,第四点和第六点
1)true:str2在编译期JVM会优化成"abc",然后判断字符串常量池中是否存在"abc"对象的引用,因为str1已经创建,所以str2从字符串常量池中获取"abc"对象的引用。所以str1和str2都是指向同一地址的引用。
2)false:上面我们知道str1指向的时字符串常量池中"abc"的引用,而str3指向的时new String()创建的新对象的引用,所以str1和str3指向的不是同一个地址的引用。
面试3:下面的代码会输出什么
String str1 = "abc";
String str2 = "ab";
String str3 = str2+"c";
System.out.println(str1==str3);
答案:false
解析:此题主要考察第三点和第五点
1)str1指向的时字符串常量池中"abc"对象的引用。
2)str3在编译时,JVM会将str3优化成如下代码。
StringBuilder sb = new StringBuilder();
sb.append(str2).append("c");
String str3 = sb.toString();
从上面代码中可以看出str3指向的时对象StringBuilder()对象的引用,所以str1和str3指向不同对象,所以false.
面试4:下面代码会输出什么
String str1 = "abc";
String str2 = "ab";
String str3 = (str2+"c").intern();
System.out.println(str1==str3);
答案:true
解析:考察第三点和第七点
1)如果字符串调用intern()方法,它会查看字符串常量池中是否存在"abc"的引用,存在直接返回它的引用。所以str1和str3指向同一个对象的地址。
面试5:为什么不要在循环中去拼接字符串
答案:因为字符串拼接在编译时期JVM会将其优化成StringBuilder对象进行拼接,如果循环次数非常大的话,创建的StringBuilder对象非常的多,甚至可能会导致内存溢出的情况。
以上就是极悦java培训机构的小编针对“Java字符串面试题深度分析”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习