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());
    }
}

Author: unname

Created: 2019-03-22 周五 01:32

Go ahead, never stop.