String、StringBuffer和StringBuilder的比较

  1. StringBuilder 和 StringBuffer非常奖似,均代表可变的字符序列,而且万法也一样
  2. String:不可变字符序列,效率低,但是复用率高
  3. StringBuffer:可变字符序列、效率较高(增删)线程安全
  4. StringBuilder:可变字符序列、效率最高线程不安全
  5. String使用注意说明:
  • string s=”a”;//创建了一个字符串
  • S += “b”;//实际上原来的”a”字符串对象已经丢弃了,现在又产生了一个字符串s+”b”(也就是”ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String 做大量修改,不要使用String

    操作效率

    StringBuilder > StringBuffer > String

  1. package test;
  2. public class Main {
  3. public static void main(String[] args) {
  4. long startTime = 0L;
  5. long endTime = 0L;
  6. StringBuffer buffer = new StringBuffer("");
  7. startTime = System.currentTimeMillis();
  8. for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000次
  9. buffer.append(String.valueOf(i));
  10. }
  11. endTime = System.currentTimeMillis();
  12. System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
  13. StringBuilder builder = new StringBuilder("");
  14. startTime = System.currentTimeMillis();
  15. for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000次
  16. builder.append(String.valueOf(i));
  17. }
  18. endTime = System.currentTimeMillis();
  19. System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
  20. String text = "";
  21. startTime = System.currentTimeMillis();
  22. for (int i = 0; i < 80000; i++) {//String 拼接 20000
  23. text = text + i;
  24. }
  25. endTime = System.currentTimeMillis();
  26. System.out.println("String的执行时间:" + (endTime - startTime));
  27. }
  28. }

image.png

使用原则

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder
  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
  4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
  5. StringBuilder 的方法使用和StringBuffer一样