String, StringBuilder, StringBuffer 区别及使用

x33g5p2x  于2022-01-04 转载在 其他  
字(4.2k)|赞(0)|评价(0)|浏览(387)

一,String, StringBuilder, StringBuffer 区别

String: 字符串常量
StringBuffer: 字符串变量(线程安全)
StringBuilder: 字符串变量(非线程安全)
在大多数情况下三者在执行速度方面的比较:StringBuilder > StringBuffer > String。

对 String 而言,其对象是不可变的,因此每次对其对象进行修改操作时都相当于产生了一个新的String 对象,然后将指针指向新的 String 对象,影响系统性能。

而对 StringBuilder 和 StringBuffer 而言,每次修改都是对本身操作,不会产生新对象,所以适合于字符串经常变化的情况。StringBuilder 和 StringBuffer相比,StringBuilder效率高,线程不安全,StringBuffer效率低,线程安全。

所以如果要操作少量的数据用 String,单线程操作字符串缓冲区 下操作大量数据用 StringBuilder,多线程操作字符串缓冲区 下操作大量数据用 StringBuffer。

二,StringBuilder 和 StringBuffer 使用

StringBulider 和 StringBuffer 用法差不多

1, insert

  1. StringBuilder sbuilder = new StringBuilder();
  2. // 在位置0处插入字符数组
  3. sbuilder.insert(0, new char[]{'a', 'b', 'c', 'd', 'e'});
  4. // 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度
  5. sbuilder.insert(0, new char[]{'A', 'B', 'C', 'D', 'E'}, 0, 3);
  6. // 在位置0处插入float
  7. sbuilder.insert(0, 1.414f);
  8. // 在位置0处插入double
  9. sbuilder.insert(0, 3.14159d);
  10. // 在位置0处插入boolean
  11. sbuilder.insert(0, true);
  12. // 在位置0处插入char
  13. sbuilder.insert(0, '\n');
  14. // 在位置0处插入int
  15. sbuilder.insert(0, 100);
  16. // 在位置0处插入long
  17. sbuilder.insert(0, 12345L);
  18. // 在位置0处插入StringBuilder对象
  19. sbuilder.insert(0, new StringBuilder("StringBuilder"));
  20. // 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是
  21. 结束位置(不包括)
  22. sbuilder.insert(0, new StringBuilder("STRINGBUILDER"), 6, 13);
  23. // 在位置0处插入StringBuffer对象。
  24. sbuilder.insert(0, new StringBuffer("StringBuffer"));
  25. // 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结
  26. 束位置(不包括)
  27. sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);
  28. // 在位置0处插入String对象。
  29. sbuilder.insert(0, "String");
  30. // 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不
  31. 包括)
  32. sbuilder.insert(0, "0123456789", 1, 6);
  33. sbuilder.insert(0, '\n');
  34. // 在位置0处插入Object对象。此处以HashMap为例
  35. HashMap map = new HashMap();
  36. map.put("1", "one");
  37. map.put("2", "two");
  38. map.put("3", "three");
  39. sbuilder.insert(0, map);

2, append

  1. StringBuilder sbuilder = new StringBuilder();
  2. // 追加字符数组
  3. sbuilder.append(new char[]{'a','b','c','d','e'});
  4. // 追加字符数组。0表示字符数组起始位置,3表示长度
  5. sbuilder.append(new char[]{'A','B','C','D','E'}, 0, 3);
  6. // 追加float
  7. sbuilder.append(1.414f);
  8. // 追加double
  9. sbuilder.append(3.14159d);
  10. // 追加boolean
  11. sbuilder.append(true);
  12. // 追加char
  13. sbuilder.append('\n');
  14. // 追加int
  15. sbuilder.append(100);
  16. // 追加long
  17. sbuilder.append(12345L);
  18. // 追加StringBuilder对象
  19. sbuilder.append(new StringBuilder("StringBuilder"));
  20. // 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)
  21. sbuilder.append(new StringBuilder("STRINGBUILDER"), 6, 13);
  22. // 追加StringBuffer对象。
  23. sbuilder.append(new StringBuffer("StringBuffer"));
  24. // 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)
  25. sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);
  26. // 追加String对象。
  27. sbuilder.append("String");
  28. // 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)
  29. sbuilder.append("0123456789", 1, 6);
  30. sbuilder.append('\n');
  31. // 追加Object对象。此处以HashMap为例
  32. HashMap map = new HashMap();
  33. map.put("1", "one");
  34. map.put("2", "two");
  35. map.put("3", "three");
  36. sbuilder.append(map);
  37. sbuilder.append('\n');
  38. // 追加unicode编码
  39. sbuilder.appendCodePoint(0x5b57); // 0x5b57是“字”的unicode编码
  40. sbuilder.appendCodePoint(0x7b26); // 0x7b26是“符”的unicode编码
  41. sbuilder.appendCodePoint(0x7f16); // 0x7f16是“编”的unicode编码
  42. sbuilder.appendCodePoint(0x7801); // 0x7801是“码”的unicode编码

3, replace

  1. StringBuilder sbuilder;
  2. sbuilder = new StringBuilder("0123456789");
  3. sbuilder.replace(0, 3, "ABCDE");
  4. sbuilder = new StringBuilder("0123456789");
  5. sbuilder.reverse();
  6. sbuilder = new StringBuilder("0123456789");
  7. sbuilder.setCharAt(0, 'M');

4, delete

  1. StringBuilder sbuilder = new StringBuilder("0123456789");
  2. // 删除位置0的字符,剩余字符是“123456789”。
  3. sbuilder.deleteCharAt(0);
  4. // 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。
  5. sbuilder.delete(3,6);
  6. // 获取sb中从位置1开始的字符串
  7. String str1 = sbuilder.substring(1);
  8. // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串
  9. String str2 = sbuilder.substring(3, 5);
  10. // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对
  11. 象,此处转型为String
  12. String str3 = (String)sbuilder.subSequence(3, 5);

5, index

  1. StringBuilder sbuilder = new StringBuilder("abcAbcABCabCaBcAbCaBCabc");
  2. // 1. 从前往后,找出"bc"第一次出现的位置
  3. sbuilder.indexOf("bc");
  4. // 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置
  5. sbuilder.indexOf("bc", 5);
  6. // 3. 从后往前,找出"bc"第一次出现的位置
  7. sbuilder.lastIndexOf("bc");
  8. // 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置
  9. sbuilder.lastIndexOf("bc", 4);

相关文章