掌握下面的几点,所有的字符串面试题就不在是什么问题了:
注:本文以JDK8说明,至于JVM在每个版本的变化会在JVM面试库中详细介绍,在这就不展开了。
第一点:字符串创建有两种方式:字面量和利用new关键字
//1:字面量创建字符串对象
Stringstr1="abc";
//2:利用new关键字创建字符串对象
Stringstr2=newString("abc");
第二点:字符串使用非常的频繁,从空间和性能方面考虑,JVM实例化字符串时进行了优化:添加了字符串常量池。
第三点:字符串常量池中的内容是类加载完成以后创建的,而字符串常量池保存的是字符串对象的引用,具体实例对象存放在堆中。
第四点:如果只是字面量进行拼接,JVM会将它们优化成一个字面量。
Stringstr="a"+"b";
//JVM会对上面的拼接进行优化,优化后
Stringstr="ab";
第五点:如果拼接中存在字符串变量,JVM会将它们优化成StringBuilder进行拼接,然后通过StringBuilder.toString()获取。
Stringstr1="ab";
Stringstr2=str1+"c";
//上面字符串拼接存在字符串变量str1,JVM会对其优化
Stringstr1="ab";
StringBuildersb=newStringBuilder();
sb.append(str1).append("c");
Stringstr2=sb.toString();
第六点:new关键字会在堆上创建一个新的对象。
第七点:intern()方法:返回常量池该字符串的引用
intern的作用:
1:如果字符串常量池中存在字符串对象的引用,则直接返回这个对象的引用
2:如果字符串常量池中不存在字符串对象的引用,则首先在堆中创建对象,然后将这个对象的引用存放在常量池中。
上面的这七点如果真正掌握了,我相信下面的面试就很容易了。
面试1:下面的一句代码创建了几个对象
Stringstr=newString("abc");
答案:创建了两个对象。
解析:此题主要考察了第三点和第六点。
1)创建的第一个对象(第三点):在类加载时,首先判断字符串常量中是否存在"abc"对象的引用,没有则创建一个"abc"对象,然后把这个对象的引用存放在字符串常量池中。
2)创建的第二个对象(第六点):new关键字会在堆中创建一个新的对象。
面试2:下面的代码会输出什么
Stringstr1="abc";
Stringstr2="a"+"b"+"c";
Stringstr3=newString("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指向的时newString()创建的新对象的引用,所以str1和str3指向的不是同一个地址的引用。
面试3:下面的代码会输出什么
Stringstr1="abc";
Stringstr2="ab";
Stringstr3=str2+"c";
System.out.println(str1==str3);
答案:false
解析:此题主要考察第三点和第五点
1)str1指向的时字符串常量池中"abc"对象的引用。
2)str3在编译时,JVM会将str3优化成如下代码。
StringBuildersb=newStringBuilder();
sb.append(str2).append("c");
Stringstr3=sb.toString();
从上面代码中可以看出str3指向的时对象StringBuilder()对象的引用,所以str1和str3指向不同对象,所以false.
面试4:下面代码会输出什么
Stringstr1="abc";
Stringstr2="ab";
Stringstr3=(str2+"c").intern();
System.out.println(str1==str3);
答案:true
解析:考察第三点和第七点
1)如果字符串调用intern()方法,它会查看字符串常量池中是否存在"abc"的引用,存在直接返回它的引用。所以str1和str3指向同一个对象的地址。
面试5:为什么不要在循环中去拼接字符串
答案:因为字符串拼接在编译时期JVM会将其优化成StringBuilder对象进行拼接,如果循环次数非常大的话,创建的StringBuilder对象非常的多,甚至可能会导致内存溢出的情况。
以上就是北大青鸟长沙麓谷校区java培训机构的小编针对“Java面试题:java字符串字面量”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
Java面试题