- 都是final类,不可以被继承
- String是字符串常量;StringBuffer,StringBuilder是字符串变量
- String长度是不可变的;StringBuffer,StringBuilder长度是可变的
- StringBuffer是线程安全的;StringBuilder不是线程安全的。StringBuilder比StringBuffer快
String不变性的理解:
- String类是被final修饰的,不能被继承
- 在用+号连接字符串时会创建一个新的字符串
- String s = new String("helloworld"); 可能创建两个对象,也可能创建一个对象。如果静态区有“helloworld”字符串常量对象的话,则只在堆里创建一个对象;如果静态区没有这个对象,那个在堆和静态区都会创建对象
常见面试题
1
String a = "hello2";
final String b = "hello";
String c = b + 2;
System.out.println((a == c));
输出结果为:true。对于被final修饰的变量,会在class文件常量池中保存一个副本,也就是说不会通过连接而进行访问,对final变量的访问在编译期间都会直接被替代为真实的值。那么String c = b + 2;在编译期间就会被优化成:String c = "hello" + 2;
2
public class Main {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static String getHello() {
return "hello";
}
}
输出结果为false。这里面虽然将b用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,因此a和c指向的不是同一个对象。