String 和 StringBuilder、StringBuffer 的区别

184 阅读1分钟

Java面试题

  • String是不可变类;
  • StringBuffer是线程安全的;
  • StringBuilder是线程不安全的,java 5引入的;
public static void main(String[] args) {
    String s1 = "Programming";
    String s2 = new String("Programming");
    String s3 = "Program";
    String s4 = "ming";
    String s5 = "Program" + "ming";
    String s6 = s3 + s4;
    System.out.println(s1 == s2);//false
    System.out.println(s1 == s5);//true
    System.out.println(s1 == s6);//false
    System.out.println(s1 == s6.intern());//true
    System.out.println(s2 == s2.intern());//false

    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());
    System.out.println(s4.hashCode());
    System.out.println(s5.hashCode());
    System.out.println(s6.hashCode());
}

为什么s1==s6是false呢?

字符串相加

  1. 字符串常量相加,jvm 会进行优化,不会创建 StringBuilder 对象
  2. 字符串变量加上常量,会创建 StringBuilder 对象,然后调用 append 方法
  3. for 循环中的字符串变量加上常量,会被优化成 StringBuilder.append(),多次相加只会创建一个 StringBuilder 对象