1. public final class StringBuffer
  2. extends AbstractStringBuilder
  3. implements java.io.Serializable, CharSequence {
  4. /**
  5. * Constructs a string buffer with no characters in it and an
  6. * initial capacity of 16 characters.
  7. */
  8. public StringBuffer() {
  9. super(16);
  10. }
  11. /**
  12. * Constructs a string buffer with no characters in it and
  13. * the specified initial capacity.
  14. */
  15. public StringBuffer(int capacity) {
  16. super(capacity);
  17. }
  18. /**
  19. * Constructs a string buffer initialized to the contents of the
  20. * specified string. The initial capacity of the string buffer is
  21. * <code>16</code> plus the length of the string argument.
  22. *
  23. * @param str the initial contents of the buffer.
  24. * @exception NullPointerException if <code>str</code> is <code>null</code>
  25. */
  26. public StringBuffer(String str) {
  27. super(str.length() + 16);
  28. append(str);
  29. }

StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
StringBuilder 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

对于StringBuffer的append操作基本是在AbstractStringBuilder继承实现,看源码:

  1. abstract class AbstractStringBuilder implements Appendable, CharSequence {
  2.  
  3. char[] value; //The value is used for character storage.
  4.  
  5. int count; //The count is the number of characters used.
  6.  
  7. //Appends the specified string to this character sequence.
  8. public AbstractStringBuilder append(String str) {
  9. if (str == null) str = "null";
  10. int len = str.length();
  11. ensureCapacityInternal(count + len);
  12. str.getChars(0, len, value, count);
  13. count += len;
  14. return this;
  15. }
  16.  
  17. // Documentation in subclasses because of synchro difference
  18. public AbstractStringBuilder append(StringBuffer sb) {
  19. if (sb == null)
  20. return append("null");
  21. int len = sb.length();
  22. ensureCapacityInternal(count + len);
  23. sb.getChars(0, len, value, count);
  24. count += len;
  25. return this;
  26. }
  27.  
  28. // Documentation in subclasses because of synchro difference
  29. public AbstractStringBuilder append(CharSequence s) {
  30. if (s == null)
  31. s = "null";
  32. if (s instanceof String)
  33. return this.append((String)s);
  34. if (s instanceof StringBuffer)
  35. return this.append((StringBuffer)s);
  36. return this.append(s, 0, s.length());
  37. }
  38.  
  39. /**
  40. * Appends the string representation of the {@code char} array
  41. * argument to this sequence.
  42. */
  43. public AbstractStringBuilder append(char[] str) {
  44. int len = str.length;
  45. ensureCapacityInternal(count + len);
  46. System.arraycopy(str, 0, value, count, len);
  47. count += len;
  48. return this;
  49. }
    }
  50. /***************其他追加字符方法省略介绍了***********/

添加字符时的扩容方法介绍:

  1. /**
  2. * This implements the expansion semantics of ensureCapacity with no
  3. * size check or synchronization.
  4. */
  5. void expandCapacity(int minimumCapacity) {
  6. int newCapacity = value.length * 2 + 2;
  7. if (newCapacity - minimumCapacity < 0)
  8. newCapacity = minimumCapacity;
  9. if (newCapacity < 0) {
  10. if (minimumCapacity < 0) // overflow
  11. throw new OutOfMemoryError();
  12. newCapacity = Integer.MAX_VALUE;
  13. }
  14. value = Arrays.copyOf(value, newCapacity);
  15. }

每次添加字符时扩容为:int newCapacity = value.length * 2 + 2;

java.lang(StringBuffer)的更多相关文章

  1. Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder

    一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高:StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全.一个线程不安全,但对内在原因并 ...

  2. java.lang.StringBuffer源码分析

    StringBuffer是一个线程安全的可变序列的字符数组对象,它与StringBuilder一样,继承父类AbstractStringBuilder.在多线程环境中,当方法操作是必须被同步,Stri ...

  3. < java.lang >-- StringBuffer字符串缓冲区

    构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一个容器. 3:是可变长度的. 4:缓冲区中可以存储任意类型的数据. 5:最终需要变成字符 ...

  4. java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)

    这两个类都是继承自AbstractStringBuilder,AbstractStringBuilder有两个成员属性 char[] value; int count; 前者用于存储字符串,后者用于统 ...

  5. JAVA String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  6. Java String StringBuffer StringBuilder

    String  字符串常量存储在常量区,每次追加操作会创建新的对象: StringBuffer  字符串变量  线程安全 在堆上创建,每次追加操作在原对象上进行操作:  速度 StringBuffer ...

  7. Java源码学习 -- java.lang.String

    java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang ...

  8. Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File

    java.lang 类 StringBuffer java.lang.Object java.lang.StringBuffer 所有已实现的接口: Serializable, Appendable, ...

  9. 排查sqoop报错:Error running child : java.lang.OutOfMemoryError: Java heap space

    报错栈: -- ::, INFO [main] org.apache.hadoop.mapred.MapTask: Processing split: = AND = -- ::, INFO [mai ...

随机推荐

  1. Python闭包和装饰器再复习

    闭包 闭包的定义 在一个外函数中定义了一个内函数,并且内函数用到了外部函数的变量,而且外函数的返回值是内函数的引用,这就构成了一个闭包. 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东 ...

  2. C# 基础知识之 Unix 时间戳转换

    unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒. /// 时间戳转为C#格式时间 private DateTime GetTime(string timeSt ...

  3. FastJSON、Gson和Jackson性能对比

    Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.本文将测试这三个类库在JSON序列化和反序列化的方面表现,主要测试JSON序列化和反序列化的速度.为了防止由于内 ...

  4. vuejs2+webpack2+vuxui2多页面架手脚,支持二级目录

    const UglifyJsPlugin = require('uglifyjs-webpack-plugin') // 去console插件 const CompressionWebpackPlug ...

  5. 设计模式のIOC(控制反转)

    一.什么是Ioc IoC(Inverse of Control)的字面意思是控制反转,它包括两个内容: 控制.反转 可以假设这样一个场景:火车运货,不同类型的车厢运送不同类型的货物,板车运送圆木,罐车 ...

  6. 清除tomcat日志文件的shell脚本

    #! /bin/bash d=`date +%F` exec >> /mydata/script/logs/$d>& echo "开始执行清除tomcat日志文件& ...

  7. P1553 数字反转(升级版)(模拟)

    花了2个小时,写的..mmp只想说,还是我太菜了. #include<iostream> #include<cstring> using namespace std; ]; i ...

  8. Mqtt用户认证

    http://emqtt.com/docs/v2/guide.html 1默认是匿名认证,不用输入用户名和密码,直接可连接 2如何开启用户名和密码认证模式 2-1关闭匿名认证 在你的MQTT安装目录下 ...

  9. pytorch学习-AUTOGRAD: AUTOMATIC DIFFERENTIATION自动微分

    参考:https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autog ...

  10. DataGuard切换(主库为Rac+备库为Rac)

    http://blog.itpub.net/29477587/viewspace-1331121/ 前段时间做了一次主备库的切换,大体写下操作步骤和记录,分享下. 环境:           db v ...