String StringBuffer StringBuilder的区别以及对String不变性的理解

 

  • 都是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指向的不是同一个对象。

 


 

你可能感兴趣的:(Java基础)