String,StringBuffer和StringBuilder常见的面试题

高频面试题

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

首先,str1str2==比较是为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);

首先,str1str2==比较是为false的。

因为是其中包含了变量进行拼接,JVM不会对其进行优化,所以str3是新创建的一个对象。

4:String str = new String("abc");创建了几个对象

创建了2个对象(前提是StringPool中不包含abc字面量)

  • abc 属于字符串字面量,因此编译时期会在 StringPool 中创建一个字符串对象,指向这个 abc 字符串字面量;
  • 而使用 new 的方式会在堆中创建一个字符串对象。

5:String、StringBuffer、StringBuilder 有什么区别?

  • String 一旦创建不可变,如果修改即创建新的对象,StringBufferStringBuilder 可变,修改之后引用不变。

  • String 对象直接拼接效率高,但是如果执行的是间接拼接,效率很低,而 StringBufferStringBuilder 的效率更高,同时 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的区别?