java笔记1:String, StringBuffer,StringBuilder

java笔记1:String, StringBuffer,StringBuilder
        1. String (不可变)
        String类型是不可变的。对String对象 的一些操作(比如,追加,取子串等),其所得到的的最终结果都是创建新的对象。而原本的对象根本没有改变。
        这样做的原因是为了多线程并发的安全考虑。若多个用户多线程并发访问这个成员变量,若对其操作不是创建新的对象,那就线程不安全了,任何人都可以对其修改,这结果是未知的,可怕的。比如:
             * String s1 = "abc";        //定义一个String
             * String s2 = s1;           //第一个用户对其修改。
             * String s3 = s1;            //第二个用户对其修改。

            String不可变特征,可以安全的实现共享。 String常量池因此而来。

      2. StringBuilder和StringBuffer(可变)
   
尽可能的用StringBuilder而不要用StringBufferStringBufferJDK4.0之前用的。现在基本不用了。
    它们的不同之处在于

   StringBuffer是线程安全(synchronized)的,StringBuilder是线程不安全的。比如:StringBufferappendString s) 用synchronized关键字修饰了,StringBuilderappend方法则没有,线程安全的设计类会折损运行速率。而通常没必要将字符串变量设计成线程安全的,因为字符串类型变量经常会用作局部变量,而java的局部变量永远是线程安全的,所以出于运行速率考虑,应该用StringBuilder。现在的开发中StringBuffer已基本被摒弃。
   
   3.什么时候用String什么时候用StringBuilder?
   
字符串做成员变量时用String,做局部变量时用StringBuilder。

      String类重写了Object类的equals方法,而StringBuffer类和StringBuilder类则没有,比较的还是内存地址引用。
  
   4.String对象的“+” 拼接运算原理

    字符串用 “” 连接时,eg: s1 = s2  + s3 + Hello World ; 其背后的原理为:
    利用
StringBuilderappend()方法

    即:s1 = new StringBuilder().append(s1).append(s2).append( HelloWorld );

    5.String与StringBuffer类执行速率对比
        String s = "";
        StringBuilder sb = new StringBuilder();
        //纳秒值
        long start = System.nanoTime();    //记录开始时间(纳秒级)
            for(int i = 0; i < 1000; i++) {
                s = s + "a";    //运行时间:3750756
                //sb = sb.append("a");    //运行时间:240533
            }
        long end = System.nanoTime();   
//记录结束时间(纳秒级)
 
        System.out.println(end - start);

你可能感兴趣的:(String,StringBuilder,StringBuffer)