经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java 基础复习——StringBuffer 和 StringBuilder
来源:cnblogs  作者:墨染启明  时间:2023/7/3 9:21:04  对本文有异议

StringBuffer 和 StringBuilder

StringBuffer 类 简介

  • java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删

  • 很多方法和 String 相同,但 StringBuffer 是可变长度的

  • StringBuffer 是一个容器

image

注意:

  1. StringBuffer 的直接父类是 AbstractStringBuilder 有属性 char[] value,不是 final 修饰
  2. StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化(可以网络传输,可以保存到文件)
  3. StringBuffer 是一个 final 类,不能被继承

StringBuffer 和 String 对比

  • String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低 // private final char[ ] value
  • StringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中

StringBuffer的构造器

  1. // Constructor and Description
  2. StringBuffer()
  3. // 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
  4. StringBuffer(CharSequence seq)
  5. // 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符
  6. StringBuffer(int capacity)
  7. // 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定
  8. StringBuffer(String str)
  9. //// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

StringBuffer 和 String 的相互转换

String ---> StringBuffer

  1. String s = "hello";

方式一:

  1. StringBuffer b1 = new StringBuffer(s);

方式二:

  1. StringBuffer b2 = new StringBuffer();
  2. b2.append(s);

StringBuffer ---> String

方式一:

  1. String s2 = b1.toString()

方式二:

  1. String s3 = new String(b1);

StringBuffer 常用方法

  1. StringBuffer append() // 增
  2. StringBuffer delete(int start, int end) // 删
  3. StringBuffer insert() // 插入
  4. StringBuffer replace(int start, int end, String str) // 改
  5. int indexOf(String str) // 查
  6. int length() // 获取长度

练习题

  1. String str = null;
  2. StringBuffer sb = new StringBuffer();
  3. sb.append(str); // 调用的AbstractStringBuilder的 appendNull方法
  4. System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
  5. System.out.println(sb.capacity()); // 16
  6. System.out.println(sb);
  7. StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
  8. System.out.println(sb1);

StringBuilder 类 简介

  • 一个可变的字符序列。此类提供与 StringBufffer 兼容的API,但不保证同步。被设计作为 StringBuffer 的建议替换,用在字符串被单个线程使用的时候。如果可能,建议有限采用该类,因在在大多数实现中,他比 StringBuffer 要快。两者的方法基本相同

image

注意:

  1. StringBuilder 是 final 类,不能被继承
  2. 继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中
  3. 实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)
  4. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用

String、StringBuffer 和 StringBuilder 的比较

  1. StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,且方法也一样

  2. String 不可变字符序列,效率低,但是复用率高

  3. StringBuffer:可变字符序列,效率较高(增删)、线程安全

  4. StringBuilder:可变字符序列,效率最高,线程不安全

  5. String 使用注意说明:

    1. String s = "a"; // 创建一个字符串
    2. s += "b";
    3. /*
    4. 实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串是 s + "b" (即"ab")。如果多次执行这些改变串内容的操作,会导致的大量副本字符串对象存在内存中,降低效率。如果这样的操作放到循环中,会极大的影响程序的性能
    5. ==> 结论:如果我们对String做大量修改,不要使用String
    6. */

    效率测试

  1. long startTime = 0L;
  2. long endTime = 0L;
  3. // StringBuffer
  4. StringBuffer stringBuffer = new StringBuffer("");
  5. startTime = System.currentTimeMillis();
  6. for (int i = 0; i < 20000; i++) {
  7. stringBuffer.append(String.valueOf(i));
  8. }
  9. endTime = System.currentTimeMillis();
  10. System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
  11. // StringBuilder
  12. StringBuilder stringBuilder = new StringBuilder("");
  13. startTime = System.currentTimeMillis();
  14. for (int i = 0; i < 20000; i++) {
  15. stringBuilder.append(String.valueOf(i));
  16. }
  17. endTime = System.currentTimeMillis();
  18. System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
  19. //String
  20. String text = "";
  21. startTime = System.currentTimeMillis();
  22. for (int i = 0; i < 20000; i++) {
  23. text += i;
  24. }
  25. endTime = System.currentTimeMillis();
  26. System.out.println("String的执行时间:" + (endTime - startTime));
  27. // StringBuffer的执行时间:5
  28. //StringBuilder的执行时间:2
  29. //String的执行时间:1463
  30. // 测试结果:StringBuilder > StringBuffer > String

String、StringBuffer 和 StringBuilder 的选择

使用的原则、结论:

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder

  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer

  4. 如果字符串很少修改,被多个对象引用,使用 String,比如配置信息等

原文链接:https://www.cnblogs.com/ai135/p/17518877.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号