• String、StringBuffer/StringBuilder 面试题


    1 面试题:String为什么是不可变的?
    我看过源代码,String类中有一个byte[]数组,这个byte[]数组采用了final修饰,
    因为数组一旦创建长度不可变。并且被final修饰的引用一旦之乡某个对象之后,不能在指向其他对象,所以String是不可变的。

    2 StringBuffer/StringBuilder 为什么是可变的呢?
    我看过源代码,StringBuffer/StringBuilder内部实际上是一个byte[]数组,
    这个byte[]数组没有被final修饰,StringBuffer/StringBuilder的初始化容量我记得是16,当内存满了之后会进行扩容。
    底层调用了数组拷贝的方法System.arraycopy()...是这样扩容的。所以StringBuffer/StringBuilder适合于使用字符串进行频繁拼接操作。
    方法为append(String str)进行拼接。

    3 StringBuffer的底层代码中有synchronized修饰符进行修饰,证明Stringbuffer是线程安全的。
    StringBuilder的底层代码中没有synchronized修饰符进行修饰,证明StringBuilder是线程不安全。
    至于什么是线程,后面会一一记录下来。


    /*
    1 面试题:String为什么是不可变的?
        我看过源代码,String类中有一个byte[]数组,这个byte[]数组采用了final修饰,
        因为数组一旦创建长度不可变。并且被final修饰的引用一旦之乡某个对象之后,不能在指向其他对象,所以String是不可变的。
    
    2 StringBuffer/StringBuilder 为什么是可变的呢?
        我看过源代码,StringBuffer/StringBuilder内部实际上是一个byte[]数组,
        这个byte[]数组没有被final修饰,StringBuffer/StringBuilder的初始化容量我记得是16,当内存满了之后会进行扩容。
        底层调用了数组拷贝的方法System.arraycopy()...是这样扩容的。所以StringBuffer/StringBuilder适合于使用字符串进行频繁拼接操作。
        方法为append(String str)进行拼接。
        
    3 StringBuffer的底层代码中有synchronized修饰符进行修饰,证明Stringbuffer是线程安全的。
      StringBuilder的底层代码中没有synchronized修饰符进行修饰,证明StringBuilder是线程不安全。
      至于什么是线程,后面会一一记录下来。
     */
    public class StringBufferTest04 {
        public static void main(String[] args) {
            // 字符串长度不可变是什么意思?
            // 是说双引号里面的字符串对象一旦创建不可变。
            String s = "abc"; // "abc"放到了字符串常量池当中,"abc"不可变
            // s变量是可以指向其他对象的。
            // 字符串不可变不是说以上变量不可变,说的是"abc"这个对象不可变。
            s = "xyz";// "xyz"放到了字符串常量池当中,"xyz"不可变
        }
    }
  • 相关阅读:
    作业
    bash陷阱
    Hive
    工作小结
    Python脚本没有实时print信息
    Ubuntu下apt-get遇到Hash Sum Mismatch
    微信小程序要2017-01-19号发布!
    flex布局学习(四)flex色子布局练习
    flex布局学习(三)
    flex布局学习(二)
  • 原文地址:https://www.cnblogs.com/xlwu/p/13216146.html
Copyright © 2020-2023  润新知