标签:bsp 可变 缺陷 速度 差距 public print 改变 art
String与StringBuffer/StringBuilder之间的主要区别
1.String对象不可变, 如果修改会重新创建一个对象, 然后把值保存进去. StringBuffer/StringBuilder对象是可变的.
2.String性能远远低于StringBuffer/StringBuilder
3.StringBuilder速度稍快于StringBuffer, 但与此带来的缺陷是StringBuilder是线程不安全的, 而StringBuffer是线程安全的.
下面执行一段代码来测试一下三者的运行时间
1 // 测试String StringBuffer StringBuilder 2 public class Test { 3 public static void main(String[] args) { 4 testString(); 5 testStringBuffer(); 6 testStringBuilder(); 7 } 8 9 // 2万次为37097毫秒 10 public static void testString() { 11 String testStr = "abcdefghijklmnopqrstuvwxyz"; 12 long start = System.currentTimeMillis(); 13 String str = ""; 14 for (int i = 0; i < 20000; i++) { 15 str += testStr; 16 } 17 long end = System.currentTimeMillis(); 18 System.out.println(end-start); 19 } 20 21 // 20万次为55毫秒 22 public static void testStringBuffer() { 23 String testStr = "abcdefghijklmnopqrstuvwxyz"; 24 long start = System.currentTimeMillis(); 25 StringBuffer sb = new StringBuffer(); 26 for (int i = 0; i < 200000; i++) { 27 sb.append(testStr); 28 } 29 long end = System.currentTimeMillis(); 30 System.out.println(end-start); 31 } 32 33 // 20万次为34毫秒 34 public static void testStringBuilder() { 35 String testStr = "abcdefghijklmnopqrstuvwxyz"; 36 long start = System.currentTimeMillis(); 37 StringBuilder sb = new StringBuilder(); 38 for (int i = 0; i < 200000; i++) { 39 sb.append(testStr); 40 } 41 long end = System.currentTimeMillis(); 42 System.out.println(end-start); 43 } 44 }
发现 String和StringBuffer/StringBuilder之间的执行速度差别巨大, 而StringBuilder稍快于StringBuffer.(为了使StringBuffer和StringBuilder之间差距明显一些, 我在这里循环了20万次)
使用建议
操作少量数据 用String
字符串经常改变的情况下, 使用StringBuffer/StringBuilder
操作大量数据 单线程->StringBuilder 多线程->StringBuffer(两者执行速度差异不大, 为了多线程安全问题, 建议使用StringBuffer)
String, StringBuffer, StringBuilder之间的区别
标签:bsp 可变 缺陷 速度 差距 public print 改变 art
原文地址:http://www.cnblogs.com/lwn007/p/7677623.html