高频面试题
1:StringBuilder的效率就一定比String高吗?
其实并这句话并不严谨,虽然大部分情况下StringBuilder
的效率更高,但是某些特定情况下不一定是这样。
String str = "Hello"+"World";
StringBuilder stringBuilder = new StringBuilder("Hello");
stringBuilder.append("World");
此时,使用String
创建的HelloWorld
是要比StringBuilder
的效率要高的,因为String
对象的直接相加,在JVM
的编译期间就自动优化成:HelloWorld
,直接一次性创建完成,所以效率是要比StringBuilder
要高的。
但是注意:
String str1 = "Hello";
String str2 = "World";
String str3 = str1+str2;
对于这样的操作,效率肯定要比直接相加的低,因为编译器不会对引用变量进行优化。
2:运行的结果是什么
String str1 = "Hello World";
String str2 = "Hello"+" World";
System.out.println(str1 == str2);
首先,str1
与str2
用==
比较是为true
的。
str2
直接相加,会在JVM
编译期间自动优化成HelloWorld
。
str1
的字面量,会先判断StringPool
中是否有HelloWorld
的值,如果有,返回引用,如果没有则创建新对象,返回引用。
str2
字面量,判断StringPool
中包含了这个值,直接返回了引用。
3:运行的结果是什么
String str1 = "Hello World";
String str2 = "Hello";
String str3 = str2 + " World";
System.out.println(str1 == str3);
首先,str1
与str2
用==
比较是为false
的。
因为是其中包含了变量进行拼接,JVM
不会对其进行优化,所以str3
是新创建的一个对象。
4:String str = new String("abc");创建了几个对象
创建了2个对象(前提是StringPool
中不包含abc
字面量)
abc
属于字符串字面量,因此编译时期会在StringPool
中创建一个字符串对象,指向这个abc
字符串字面量;- 而使用
new
的方式会在堆中创建一个字符串对象。
5:String、StringBuffer、StringBuilder 有什么区别?
-
String
一旦创建不可变,如果修改即创建新的对象,StringBuffer
和StringBuilder
可变,修改之后引用不变。 -
String
对象直接拼接效率高,但是如果执行的是间接拼接,效率很低,而StringBuffer
和StringBuilder
的效率更高,同时StringBuilder
的效率高于StringBuffer
。 -
StringBuffer
的方法是线程安全的,StringBuilder
是线程不安全的,在考虑线程安全的情况下,应该使用StringBuffer
。
6:运行的结果是什么
public static void main(String[] args) {
String str = "Hello";
test(str);
System.out.println(str);
}
public static void test(String str){
str+="World";
}
Hello
,因为 String
是不可变的,传入 test
方法的参数相当于 str
的一个副本,所以方法内只是修改了副本,str
本身的值没有发生变化。
7:运行的结果是什么
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Hello");
test(str);
System.out.println(str);
}
public static void test(StringBuffer str){
str.append(" World");
}
Hello World
,因为 StringBuffer
是可变类型,传入 test
方法的参数就是 str
的引用,所以方法内修改的就是 str
本身。
来源:微信公众号
作者:南风
原文:参加了这么多面试,还是不懂StringBuffer和StringBuilder的区别?
Q.E.D.