美文网首页
String,StringBulid,Stringbuffer

String,StringBulid,Stringbuffer

作者: 躬行者_白 | 来源:发表于2018-05-21 17:08 被阅读0次

    1、String为什么不可变

        String类被final修饰,是不可以被继承,方法不可以被重写的;底层是由final修饰的char数组组成的,说明该数组的引用地址不是可以发生改变的。并且并没有提供该数组的get,set操作,char内的数据因此也不可以被改变。所以说String是不可变的。

        但是通过反射可以改变。

    2、StringBulid与StringBuffer的区别

        1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。

        2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

        3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低。

    3、扩容机制

        默认16,每次扩容大小为*2+2,如果扩容后容量还不够,直接阔到需要空间的存储容量。最大为Integer的最大值。

    4、一些面试题

    4.1. 下面这段代码的输出结果是什么?

      String a = "hello2";   String b = "hello" + 2;   System.out.println((a == b));

      输出结果为:true。原因很简单,"hello"+2在编译期间就已经被优化成"hello2",因此在运行期间,变量a和变量b指向的是同一个对象。

    4.2.下面这段代码的输出结果是什么?

      String a = "hello2";    String b = "hello";      String c = b + 2;      System.out.println((a == c));

      输出结果为:false。由于有符号引用的存在,所以  String c = b + 2;不会在编译期间被优化,不会把b+2当做字面常量来处理的,因此这种方式生成的对象事实上是保存在堆上的。

    4.3.下面这段代码的输出结果是什么?

      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;

    相关文章

      网友评论

          本文标题:String,StringBulid,Stringbuffer

          本文链接:https://www.haomeiwen.com/subject/chsfjftx.html