String/SB
1 总结
- 为了优化效率,String 使用了常量池方式实现。但偏偏在大量字符串拼接的地方,效率特别特别低
- StringBuffer 是线程安全的;StringBuilder 不是。
- StringBuffer 因为使用了 Synchronized 保证安全,所以慢。
- StringBuilder 没有做线程安全处理,但是它最快。
- 能用 StringBuilder 的地方,不要使用 StringBuffer。在大量拼接的地方,不要使用 String
2 测试
测试三种的效率差别:
public static void main (String... args) { int N = 77777777; long t; { StringBuffer sb = new StringBuffer(); t = System.currentTimeMillis(); for (int i = 0; i < N; i++) { sb.append("."); } System.out.println(System.currentTimeMillis() - t); } { StringBuilder sb = new StringBuilder(); t = System.currentTimeMillis(); for (int i = 0; i < N; i++) { sb.append("."); } System.out.println(System.currentTimeMillis() - t); } { String origin = ""; t = System.currentTimeMillis(); for (int i = 0; i < N; i++) { origin += '.'; } System.out.println(System.currentTimeMillis() - t); } }
测试线程安全性:
public static void main (String... args) { int N = 777777; { List<Thread> threads = new ArrayList<>(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < N; i++) { Thread t = new Thread(() -> { sb.append("."); }); threads.add(t); t.start(); } for (Thread t: threads) { t.join(); } System.out.println(sb.length()); } { List<Thread> threads = new ArrayList<>(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < N; i++) { Thread t = new Thread(() -> { sb.append("."); }); threads.add(t); t.start(); } for (Thread t: threads) { t.join(); } System.out.println(sb.length()); } }