String StringBuffer StringBuilder

String&StringBuilder&StringBuffer的关联与不同

 
  1. 首先String是不可以改变的,也就是说,java内置的基本数据类型String被表示为final类,final类不可以被继承。
  2. 当一个方法以String类型为参数,返回以个String类型的对象,那么,被引入为参数的String对象,其地址引用时没有改变的,返回的新的String对象,是新创建的。
  3. 当“+”与String对象进行操作时,实际上是调用了String对象内置的append方法(MayBe),实际上,java虚拟机非显示的调用了java.lang.StringBuilder类,StringBuilder类具有append方法,StringBuilder对象被创建时预定了一定的内存大小,我们可以手动的为其指定大小。
  4. StringBuilder还有其他的方法,如reverse , delete ,insert , replace , subString。
  5. StringBuffer与StringBuilder的功能相同,StringBuilder出现于java se5 , StringBuffer是线程安全的。

StringBuilder线程不安全的例子

Stringbuilderdemo代码  
package com.xiva.demo;  

public class StringBuilderDemo extends Thread {   

    private StringBuilder sb;   

    public StringBuilderDemo(String name,StringBuilder sb) {   

        super(name);   

        this.sb = sb;   

    }   

      

    @Override   

    public void run() {   

        for (int i = 0; i < 10000; i++) {   

            sb.append("abc");  

//          System.out.println(Thread.currentThread().getName()+sb.toString());  

        }   

    }   

   

  

    public static void main(String[] args) {   

        StringBuilder sBuilder = new StringBuilder();   

        StringBuilderDemo mt = new StringBuilderDemo("sBuilder线程",sBuilder);   

//      new Thread(mt).start();  

        mt.start();  

        for (int i = 0; i < 10000; i++) {   

            sBuilder.append("abcd");   

        }  

        System.out.println("main"+sBuilder.length());  

//      System.out.println("main"+sBuilder.toString());   

    }  

}   

 main所打印出的sBuilder的长度不定,也就是说mt线程执行的时候,main函数对sBuilder仍在影响,而下面的例子中,所打印出的(线程是安全的)长度是一定的!

Stringbufferdemo代码  
package com.xiva.demo;  

  

public class StringBufferDemo extends Thread {   

    private StringBuffer sBuffer;   

    public StringBufferDemo(String name,StringBuffer sb) {   

        super(name);   

        this.sBuffer = sb;   

    }   

      

    @Override   

    public void run() {   

        for (int i = 0; i < 10000; i++) {   

            sBuffer.append("abc");  

//          System.out.println(Thread.currentThread().getName()+sb.toString());  

        }  

          

    }   

   

  

    public static void main(String[] args) {   

        StringBuffer sBuffer = new StringBuffer();   

        StringBufferDemo mt = new StringBufferDemo("sBuffer线程",sBuffer);  

        mt.start();  

//      new Thread(mt).start();  

//      new Thread(mt).start();  

        for (int i = 0; i < 10000; i++) {   

            sBuffer.append("abcd");   

        }  

        while(mt.isAlive()){   

        }  

        System.out.println(sBuffer.length());   

    }  

}  

代码转载自:

 

原文地址:https://www.cnblogs.com/tatame/p/2625902.html