基本概念

解决字符串是个常量不可改变,重新申请存储浪费内存空间
java.lang.StringBuffer java.lang.StringBuilder
1.0开始 线程安全效率低 1.5开始 非线程安全效率高

StringBuilder类常用的构造方法

StringBuilder() 使用无参方式构造对象,容量为16
StringBuilder(int capacity) 根据参数指定的容量来构造对象,容量为参数指定大小
StringBuilder(String str) 根据参数指定的字符串来构造对象,容量为:16+字符串长度
  1. public class StringBuilderTest {
  2. public static void main(String[] args) {
  3. //1.使用无参方式构造StringBuilder类型的对象并打印容量和长度
  4. StringBuilder sb1=new StringBuilder();
  5. System.out.println("sb1="+sb1);
  6. System.out.println(sb1.capacity());
  7. System.out.println(sb1.length());
  8. System.out.println("---------------");
  9. StringBuilder sb2 = new StringBuilder(20);
  10. System.out.println("sb1="+sb2);
  11. System.out.println(sb2.capacity());
  12. System.out.println(sb2.length());
  13. System.out.println("---------------");
  14. //根据参数指定的字符串内容来构造对象并打印容量和长度
  15. StringBuilder sb3 = new StringBuilder("hello");
  16. System.out.println("sb1="+sb3);
  17. System.out.println(sb3.capacity());//16+5
  18. System.out.println(sb3.length());//5
  19. }
  20. }

StringBuilder类常用的成员方法

int capacity() 用于返回调用对象的容量
int length() 用于返回字符串的长度,也就是字符的个数


StringBuilder insert(int offset, String str)
插入字符串并返回调用对象的引用,就是自己。
StringBuilder append(String str) 追加字符串
StringBuilder deleteCharAt(int index) 将当前字符串中下标为index位置的单个字符删除
StringBuilder delete(int start,int end) 删除字符串
StringBuilder replace(int start,int end,
String str)
替换字符串
StringBuilder reverse() 字符串反转
  1. public class StringBuilderTest {
  2. public static void main(String[] args) {
  3. //1.使用无参方式构造StringBuilder类型的对象并打印容量和长度
  4. StringBuilder sb1=new StringBuilder();
  5. System.out.println("sb1="+sb1);
  6. System.out.println(sb1.capacity());
  7. System.out.println(sb1.length());
  8. System.out.println("---------------");
  9. StringBuilder sb2 = new StringBuilder(20);
  10. System.out.println("sb1="+sb2);
  11. System.out.println(sb2.capacity());
  12. System.out.println(sb2.length());
  13. System.out.println("---------------");
  14. //根据参数指定的字符串内容来构造对象并打印容量和长度
  15. StringBuilder sb3 = new StringBuilder("hello");
  16. System.out.println("sb1="+sb3);
  17. System.out.println(sb3.capacity());//16+5
  18. System.out.println(sb3.length());//5
  19. System.out.println("---------------");
  20. //4.实现增删改查
  21. //4.1插入和追加
  22. //返回调用自己的引用,也就是返回值和调用对象是同一个对象
  23. StringBuilder sb4 = sb3.insert(0, "abcd");
  24. System.out.println("sb4="+sb4);//abcdhello
  25. System.out.println("sb3="+sb3);//abcdhello
  26. System.out.println(sb3.insert(4, "1234"));//abcd1234hello
  27. System.out.println(sb4.insert(sb3.length(), "ABCD"));//abcd1234helloABCD
  28. System.out.println(sb3.append("world"));//abcd1234helloABCDworld
  29. //当字符串长度尝过了字符串对象的初始容量时,该字符串会自动扩容,默认扩容算法是:原始容量*2+2
  30. //底层采用byte数组来存放所有的字符
  31. System.out.println(sb3.capacity());//44
  32. System.out.println(sb3.length());//22
  33. System.out.println("---------------");
  34. //5.删除
  35. sb3.deleteCharAt(8);//表示删除下标为8的字符
  36. System.out.println("sb3="+sb3);
  37. //使用for循环删除多个字符
  38. for (int i=8; i<12;i++){
  39. // sb3.deleteCharAt(i);//abcd1234loBDworld
  40. //由结果可知,删除一个字符后就跳过一个字符继续删除,因为每当删除一个字符后后面的字符会向前部位,因此下标会发生变化
  41. sb3.deleteCharAt(8);
  42. }
  43. System.out.println("删除结果为:"+sb3);
  44. System.out.println("------------------------------");
  45. sb3.delete(0,4);
  46. System.out.println("sb3="+sb3);
  47. sb3.delete(4,8);
  48. System.out.println("sb3="+sb3);
  49. sb3.delete(4,sb3.length());
  50. System.out.println("sb3="+sb3);
  51. //修改 查找 翻转操作
  52. System.out.println("------------------------------");
  53. sb3.setCharAt(0,'a');
  54. System.out.println("修改单个字符的内容是:"+sb3);
  55. //修改"234"为"bcd"
  56. sb3.replace(1,4,"bcd");
  57. System.out.println("修改字符串后的内容是:"+sb3);
  58. //实现查找的功能
  59. int pos = sb3.indexOf("b");
  60. System.out.println("从先往后查找的内容是:"+pos);
  61. pos=sb3.lastIndexOf("b");
  62. System.out.println("从后往前查找的内容是:"+pos);
  63. //翻转
  64. sb3.reverse();
  65. System.out.println("反转后的内容是:"+sb3);
  66. //7.笔试考点
  67. //考点一:既然StringBuilder类的对象本身可以修改,那么为什么成员方法还有返回值么?
  68. //解析:为了连续调用
  69. // sb3.reverse().append("1").append("0").insert(0,"3").delete(0,1).reverse();
  70. // System.out.println(sb3);
  71. //考点二:如何实现StringBuilder类型和String类型之间的转换?
  72. //String str3=sb3.toString();
  73. //StringBuilder str5=new StringBuilder(str3);
  74. //考点三: String StringBuilder StringBuffer 之间效率最高? 如何排列?
  75. //String<StringBuffer<StringBuilder
  76. }
  77. }