• 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"不可变
        }
    }
  • 相关阅读:
    vue的学习总结---事件处理
    记一次写入导出优化,分别基于poi的SXSSF和阿里的EasyExcel
    linux系统tomcat部署SpringBoot+vue前后端分离项目正式部署
    java中各jar的作用
    记一次SpringBoot集成WebService使用Postman进行的测试
    搭建VUE
    查看window进程,并杀死进程
    卸载 nginx 彻底删除
    ubuntu16.04 安装 nginx 服务器
    Linux ubuntu ... root 初始化密码设置
  • 原文地址:https://www.cnblogs.com/xlwu/p/13216146.html
Copyright © 2020-2023  润新知