剖析JDK源码-StringBuffer-(4)

剖析JDK源码-StringBuffer-(4)

一、简述

  • 在JDK1.0就被提出来,以便对字符串进行修改的操作,(单靠String只能不断的增加新的对象来保存修改后的字符串)。
  • StringBuffer的另一个名字叫字符串缓冲区,也可以说它是一个容器。
  • 可以在不产生新的未使用对象情况下对字符串的值进行修改。
  • 可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

二、类声明和属性

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{

	private transient char[] toStringCache;
	
	static final long serialVersionUID = 3388685877147921107L;
	
	 private static final java.io.ObjectStreamField[] serialPersistentFields =
    {
        new java.io.ObjectStreamField("value", char[].class),
        new java.io.ObjectStreamField("count", Integer.TYPE),
        new java.io.ObjectStreamField("shared", Boolean.TYPE),
    };
}

从类的声明可以看到:

  • StringBuffer 继承了AbstractStringBuilder (字符串生成器)。
  • StringBuffer 实现了Serializable(序列化),CharSequence(字符序列)。
  • 和String一样被final修饰,所以StringBuffer也是线程安全的。
  • 成员变量toStringCache被transient修饰,(关键字transient表示在序列化对象的时候,这个属性就不会被序列化)。
  • 变量toStringCache用于缓存StringBuffer对象维护的字符数组,作用是保证线程操作StringBuffer对象时都能让toString方法表现出相同的结果。

三、构造方法

1、构造一个没有字符的字符串缓冲区,默认初始容量为16个字符。也可以构造一个自定义大小的字符串缓冲区。

public StringBuffer() {
        super(16);
    }

2、构造一个没有字符和指定的初始容量的字符串缓冲区。

public StringBuffer(int capacity) {
        super(capacity);
    }

3、构造一个初始化为指定字符串内容的字符串缓冲区,容量为字符串加16个字符的大小。

public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }

4、构造一个包含与指定的相同字符的字符串缓冲区 ,容量为字符串加16个字符的大小。

public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

参数CharSequence 和String的不同在于传进来的是一个字符串还是一个字符序列。

四、内部方法

1、public synchronized int length();返回长度(字符数)。
和String类中不同,因为StringBuffer是一个可变的容器,所以他的字符长度是可变的,也因此需要使用synchronized来修饰(后面会发现StringBuffer大部分方法都会用到关键字synchronized)以保证获取到的数据的完整性,从他返回值看,返回的是构造器AbstractStringBuilder的一个属性值 。
2、public synchronized int capacity();返回的是当前容量值。
3、public synchronized void ensureCapacity(int minimumCapacity);确保容量至少等于指定的最小值。
4、public synchronized void trimToSize();尝试减少用于字符序列的存储。

 		StringBuffer d = new StringBuffer(16); //声明一个容量为16的容器
        d.append("1111111111111"); //往容器添加字符
        d.trimToSize();//抹掉空白存储空间
        System.out.println(d.length());
        System.out.println(d.capacity());
#
输出
13
13

5、 public synchronized void setLength(int newLength);设置字符序列的长度。
重新设定构造器中字符长度

 public void setLength(int newLength) {
        if (newLength < 0)
            throw new StringIndexOutOfBoundsException(newLength);
        ensureCapacityInternal(newLength);

        if (count < newLength) {
            Arrays.fill(value, count, newLength, '\0');
        }

        count = newLength;
    }

6、public synchronized char charAt(int index);返回 char在指定索引在这个序列值。
7、public synchronized int codePointAt(int index) ;返回指定索引处的字符(Unicode代码点)。
8、public synchronized int codePointBefore(int index);返回指定索引之前的字符(Unicode代码点)。
9、 public synchronized int codePointCount(int beginIndex, int endIndex);返回此序列指定文本范围内的字符(Unicode代码点)个数。
10、public synchronized int offsetByCodePoints(int index, int codePointOffset);返回此序列中与 index 和 codePointOffset代码点偏移的索引。
11、public synchronized void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);字符从该序列起止段复制到目标字符数组 dst 的指定起点位置。

		StringBuffer d = new StringBuffer(16); //声明一个容量为16的容器
        d.append("1158111111111"); //往容器添加字符
		char ch[] = {'a','b','c','d','e','f','g'};//字符数组
        d.getChars(1,5,ch,0);//复制覆盖,从d的下标1到下标5段,覆盖到ch并且从ch的下标0开始
        System.out.println(ch);
 
 #输出
 1581efg

12、public synchronized void setCharAt(int index, char ch);指定索引处的字符设置为 ch 。
13、public synchronized StringBuffer append();共有13个不同参数的append方法,将字符对象添加到此字符;
14、 public synchronized StringBuffer insert();共有12个不同参数的insert方法,将字符对象插入到此字符,或可以指定位置添加;
说明:insert能在字符串的任意位置添加,而append只能在末尾
15、public synchronized StringBuffer delete(int start, int end);删除此序列的子字符串中指定位置范围的字符。
16、public synchronized StringBuffer deleteCharAt(int index);删除 char在这个序列中的指定位置的字符。
17、public synchronized StringBuffer replace(int start, int end, String str);用指定的String中的字符替换此序列的子字符串中的 String 。
18、public synchronized String substring(int start);
public synchronized String substring(int start, int end)
返回一个新的 String ,从指定下标位置起(或可指定结束位置)。
public synchronized CharSequence subSequence(int start, int end);返回一个新的字符序列,从指定开始位置到指定结束位置段。
说明:三个方法都是调用同一个父类方法
20、public int indexOf(String str);返回指定子字符串第一次出现的字符串内的索引。
21、public synchronized int indexOf(String str, int fromIndex);返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
22、public int lastIndexOf(String str);返回指定子字符串最后一次出现的字符串内的索引。
23、public synchronized int lastIndexOf(String str, int fromIndex);返回指定子串的最后一次出现的字符串中的索引,从指定的索引开始。
24、public synchronized StringBuffer reverse();导致该字符序列被序列的相反代替。
25、public synchronized String toString();返回表示此顺序中的数据的字符串。

五、常见面试题

1、StringBuffer 和数组的区别?
解:二者都可以看作是一个容器,用于装其他的数据。但是,StringBuffer的数据最终是一个字符串数据,而数组可以放置任意类型的同一种数据。
2、String和StringBuffer在作为参数时的区别?
解:String作参数时,形式参数的改变不影响实际参数的值

StringBuffer作参数时,形式参数的改变会影响实际参数的值

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值