验证String、StringBuffer、StringBuilder区别
1、线程安全概念
线程安全指的是多个线程并发执行的时候,当一个线程访问该类的某个数据的时候,通过加锁的机制,保护数据,
直至当前线程读取完,释放锁后,其他线程才能继续使用,我们认为这样是线程安全的。
2、验证String、StringBuffer、StringBuilder区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数
据这个String类提供了数值不可改变字符串而这个StringBuffer类提供的字符串进行修改当你知道字
符数据要改变的时候你就可以使用StringBuffer典型地,你可以使用StringBuffers来动态构造字符数据
String 类型和StringBuffer的主要性能区别:String是不可变的对象,因此在每次对String类型进行改变
的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的
字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多
了以后, JVM 的 GC 就会开始工作,性能就会降低。
StringBuilder是一个可变的字符序列,是JDK5.0新增的。此类提供一个与StringBuffer兼容的API,但不
保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候
(这种情况很普遍)。
例如:
public static void main(String[] args) { String(); StringBuffer(); StringBuilder(); } private static void String(){ long start=System.currentTimeMillis(); String str="a"; for (int i = 0; i < 10000; i++) { str+=i; } long stop=System.currentTimeMillis(); System.out.println("String time:"+(stop-start)); } private static void StringBuffer(){ long start=System.currentTimeMillis(); StringBuffer str=new StringBuffer("a"); for (int i = 0; i < 10000; i++) { str.append(i); } long stop=System.currentTimeMillis(); System.out.println("StringBuffer time:"+(stop-start)); } private static void StringBuilder(){ long start=System.currentTimeMillis(); StringBuilder str=new StringBuilder("a"); for (int i = 0; i < 10000; i++) { str.append(i); } long stop=System.currentTimeMillis(); System.out.println("StringBuilder time:"+(stop-start)); }
结果:
此方法要在数值比较大的时候才好验证。
在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。
例如:
public static void main(String[] args) { long a=100000; { List<Thread>li=new ArrayList<Thread>(); StringBuffer sb=new StringBuffer("a"); for (int i = 0; i < a; i++) { Thread tr=new Thread(){ @Override public void run() { sb.append("."); } }; tr.start(); li.add(tr); } for (Thread item:li) { try { item.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("lengthOne="+sb.length()); } //=================================== { List<Thread>li=new ArrayList<Thread>(); StringBuilder sb=new StringBuilder("a"); for (int i = 0; i < a; i++) { Thread tr=new Thread(){ @Override public void run() { sb.append("."); } }; tr.start(); li.add(tr); } for (Thread item:li) { try { item.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("lengthTne="+ sb.length()); } }
结果: