zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)详解编程语言

JAVA编程语言 详解 lang StringBuilder stringbuffer JDK1.8
2023-06-13 09:20:31 时间

前者用于存储字符串,后者用于统计实际使用了多少位,也就是实际存入字符串长度。当new一个StringBuilder或者StringBuffer的时候,默认capacity为16,也即声明出一个16大小的字符数组,此时count=0,value.length=16。

1 public StringBuilder() // 初始char[]长度为16 

2 public StringBuffer() // 初始char[]长度为16 

4 public StringBuilder(String str) // 初始char[]长度为str.length+16 

5 public StringBuffer(String str) // 初始char[]长度为str.length+16

在StringBuilder中基本上自身并没有重新定义什么方法,都是通过super调用的父类AbstractStringBuilder中定义的方法。

在StringBuffer中情况类似,基本上也没有重新定义什么方法,也都是调用父类AbstractStringBuilder中的方法,不过调用的时候方法都是加上了synchronzied,增加了同步锁保证线程安全。在方法前面加上synchronized作用对象是调用该方法的对象实例。

此外StringBuffer中增加了一个私有成员变量:

1 private transient char[] toStringCache

transient短暂的意思,是个关键字,用它声明的实例变量,其值不需要维持,换言之序列化的时候不会参与序列化过程。

 // StringBuilder 

 public String toString() { 

 // Create a copy, dont share the array 

 return new String(value, 0, count); 

 // StringBuffer 

 public synchronized String toString() { 

 if (toStringCache == null) { 

 toStringCache = Arrays.copyOfRange(value, 0, count); 

 return new String(toStringCache, true); 

 }

在toString方法中,StringBuffer是将内容拷贝到toStringCache,然后再构造String。toStringCache在任何修改都会被清空置为null。在字符数组未被修改的情况下,下次再调用toString则可以直接使用缓存去构造字符串了。

下面直接看下AbstractStringBuilder类的方法。

1 public void ensureCapacity(int minimumCapacity)

该方法用于扩大value的容量,minimumCapacity如果大于value.length则newCapacity = max{value.length*2 + 2, minimumCapacity},如果newCapcity MAX_ARRAY_SIZE则最终的capacity = max{minimumCapacity, MAX_ARRAY_SIZE}。其中MAX_ARRAY_SIZE = Integer.MAX_VALUE 8 。

在类中定义了各种append方法,如果append方法的参数为null的时候,append结果是将“null”字符串加到现有字符数组后面,而不是什么都不加。如果append(boolean),则是将“true”或者“false”添加到现有字符数组的最后。

AbstractStringBuilder主要定义的是各种append和insert方法。难度都不大,这里不赘述了~~

 

11355.html

cjava