String StringBuffer StringBuilder
String&StringBuilder&StringBuffer的关联与不同
- 首先String是不可以改变的,也就是说,java内置的基本数据类型String被表示为final类,final类不可以被继承。
- 当一个方法以String类型为参数,返回以个String类型的对象,那么,被引入为参数的String对象,其地址引用时没有改变的,返回的新的String对象,是新创建的。
- 当“+”与String对象进行操作时,实际上是调用了String对象内置的append方法(MayBe),实际上,java虚拟机非显示的调用了java.lang.StringBuilder类,StringBuilder类具有append方法,StringBuilder对象被创建时预定了一定的内存大小,我们可以手动的为其指定大小。
- StringBuilder还有其他的方法,如reverse , delete ,insert , replace , subString。
- 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()); } }
代码转载自: