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

 


 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值