1. StringBuilder和StringBuffer都继承了AbstractStringBuilder。它们都是由可变的char[] value和int count组成。而AbstractStringBuilder中唯一的抽象方法是toString()。StringBuffer中所有的method都是synchronized的。
2. StringBuilder和StringBuffer无参数的构造函数会分配大小为16的char array,而参数为String的构造函数也会比传入的String多分配16个char。
3. AbstractStringBuilder.ensureCapacity(int minimumCapacity), 如果 minimumCapacity 大于length会取 minimumCapacity和 length*2 + 2中较大者作为新分配空间char array的大小。这个方法在char array扩展时都会被调用。
4. trimToSize() 将char array缩小到count大小的空间。
5. setLength(int newLength) 将 count变为newLength。如果newLength比原来的count大,扩展char array, 大于原来count部分的char用'\u0000' 填充。
6. append(null) 的时候作为 append("null") 处理,与 String.valueOf() 同理。
7. capacity()方法返回 count。
8. System.arraycopy 可以用作在同一个array中移动部分数据,比如: System.arraycopy( array, 5 , array, 6, 10 ) 会将 array中的数据从第5个之后的10个数据往后移一位。
9. reverse()方法是按CodePoint reverse的,但原来的char array中不成对的surrogate pairs,在reverse后很可能成为了成对的surrogate paris。因为不成对的surrogate pair会被当成两个BMP中的char处理。
10. StringBuilder 自己定义了 serialize 和 反 serialize方法:
/** * Save the state of the <tt>StringBuilder</tt> instance to a stream * (that is, serialize it). * * @serialData the number of characters currently stored in the string * builder (<tt>int</tt>), followed by the characters in the * string builder (<tt>char[]</tt>). The length of the * <tt>char</tt> array may be greater than the number of * characters currently stored in the string builder, in which * case extra characters are ignored. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { s.defaultWriteObject(); s.writeInt(count); s.writeObject(value); } /** * readObject is called to restore the state of the StringBuffer from * a stream. */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); count = s.readInt(); value = (char[]) s.readObject(); }
11. StringBuffer 自己写了 serialize 和 反 serialize方法:
/** * Serializable fields for StringBuffer. * * @serialField value char[] * The backing character array of this StringBuffer. * @serialField count int * The number of characters in this StringBuffer. * @serialField shared boolean * A flag indicating whether the backing array is shared. * The value is ignored upon deserialization. */ 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), }; /** * readObject is called to restore the state of the StringBuffer from * a stream. */ private synchronized void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { java.io.ObjectOutputStream.PutField fields = s.putFields(); fields.put("value", value); fields.put("count", count); fields.put("shared", false); s.writeFields(); } /** * readObject is called to restore the state of the StringBuffer from * a stream. */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { java.io.ObjectInputStream.GetField fields = s.readFields(); value = (char[])fields.get("value", null); count = fields.get("count", 0); }
既然读入的时候忽略 shared,为什么还要写入呢?
相关推荐
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
"String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
StringBuilder和StringBuffer的异同解析 StringBuilder和StringBuffer是Java中两个常用的字符串处理类,它们都用于字符串的处理和操作,但它们之间存在一些关键的差异。本文将从源码角度对StringBuilder和...
在Java编程语言中,`String`、`...理解`String`、`StringBuffer`和`StringBuilder`的区别和使用场合,可以帮助开发者写出更高效、更安全的代码。在实际开发中,应根据项目需求和环境选择合适的字符串处理类。
String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...
String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...
- **StringBuffer** 和 **StringBuilder** 都是`java.lang`包下的公共类(`public class`),它们都继承自`AbstractStringBuilder`,并实现了`java.io.Serializable`和`CharSequence`接口。这意味着它们都可以序列化,...
String和StringBuilder、StringBuffer的区别? 答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是...
`StringBuilder`和`StringBuffer`是Java中处理字符串拼接的重要工具,它们通过`AbstractStringBuilder`类实现了大部分功能。`StringBuilder`适用于单线程环境,追求性能;`StringBuffer`适用于多线程环境,保证数据...
StringBuffer 和 StringBuilder 是 Java 语言中两个常用的字符串操作类,它们都是 CharSequence 接口的实现类,并且都继承了 AbstractStringBuilder 类。下面是对这两个类的源码分析。 首先,StringBuffer 是线程...
String,StringBuilder,StringBuffer
总的来说,`String`、`StringBuffer`和`StringBuilder`各有其适用的场合,理解它们之间的差异和特性,能够帮助开发者编写出更加高效、安全的代码。在实际开发中,应根据需求和上下文灵活选择合适的字符串处理类。
- 如果程序对性能有较高要求,则应当优先考虑使用 **StringBuilder** 而不是 **StringBuffer**,除非确实需要线程安全。 #### 五、代码示例 下面通过几个具体的示例来进一步说明这些区别: 1. **字符串拼接** ...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
String、StringBuilder以及StringBuffer的区别
总的来说,了解`String`、`StringBuffer`和`StringBuilder`的特性并根据实际情况选择合适的类,对于编写高效、线程安全的Java代码至关重要。在日常开发中,应尽量避免不必要的字符串对象创建,特别是在循环中,合理...