src/java.base/share/classes/java/lang/StringBuffer.java
Print this page
@@ -102,11 +102,11 @@
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
- private transient char[] toStringCache;
+ private transient String toStringCache;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L;
/**
@@ -167,19 +167,17 @@
return count;
}
@Override
public synchronized int capacity() {
- return value.length;
+ return super.capacity();
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
- if (minimumCapacity > value.length) {
- expandCapacity(minimumCapacity);
- }
+ super.ensureCapacity(minimumCapacity);
}
/**
* @since 1.5
*/
@@ -202,13 +200,11 @@
* @throws IndexOutOfBoundsException {@inheritDoc}
* @see #length()
*/
@Override
public synchronized char charAt(int index) {
- if ((index < 0) || (index >= count))
- throw new StringIndexOutOfBoundsException(index);
- return value[index];
+ return super.charAt(index);
}
/**
* @throws IndexOutOfBoundsException {@inheritDoc}
* @since 1.5
@@ -259,14 +255,12 @@
* @throws IndexOutOfBoundsException {@inheritDoc}
* @see #length()
*/
@Override
public synchronized void setCharAt(int index, char ch) {
- if ((index < 0) || (index >= count))
- throw new StringIndexOutOfBoundsException(index);
toStringCache = null;
- value[index] = ch;
+ super.setCharAt(index, ch);
}
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
@@ -678,13 +672,15 @@
@Override
@HotSpotIntrinsicCandidate
public synchronized String toString() {
if (toStringCache == null) {
- toStringCache = Arrays.copyOfRange(value, 0, count);
+ return toStringCache =
+ isLatin1() ? StringLatin1.newString(value, 0, count)
+ : StringUTF16.newString(value, 0, count);
}
- return new String(toStringCache, true);
+ return new String(toStringCache);
}
/**
* Serializable fields for StringBuffer.
*
@@ -708,11 +704,17 @@
* 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);
+ char[] val = new char[capacity()];
+ if (isLatin1()) {
+ StringLatin1.getChars(value, 0, count, val, 0);
+ } else {
+ StringUTF16.getChars(value, 0, count, val, 0);
+ }
+ fields.put("value", val);
fields.put("count", count);
fields.put("shared", false);
s.writeFields();
}
@@ -721,9 +723,14 @@
* 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);
+ char[] val = (char[])fields.get("value", null);
+ initBytes(val, 0, val.length);
count = fields.get("count", 0);
}
+
+ protected synchronized void getBytes(byte dst[], int dstBegin, byte coder) {
+ super.getBytes(dst, dstBegin, coder);
+ }
}