zoukankan      html  css  js  c++  java
  • 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"不可变
        }
    }
  • 相关阅读:
    <C++ QT4 GUI 编程>第一章笔记
    生成snmp++动态库
    PHP 5.3 新特性
    编译安装-Subversion 1.8.5
    Xen入门系列四【Xen 管理实操】
    Xen入门系列三【Xen 管理工具 xm】
    COMET探索系列三【异步通知服务器关闭数据连接实现思路】
    PHP生成二维码【谷歌API+qrcode+圆角Logo】
    SSH免密码登陆详解
    COMET探索系列二【Ajax轮询复用模型】
  • 原文地址:https://www.cnblogs.com/xlwu/p/13216146.html
Copyright © 2011-2022 走看看