1 /*
2  * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package java.lang;
27 
28 import jdk.internal.HotSpotIntrinsicCandidate;
29 
30 /**
31  * A mutable sequence of characters.  This class provides an API compatible
32  * with {@code StringBuffer}, but with no guarantee of synchronization.
33  * This class is designed for use as a drop-in replacement for
34  * {@code StringBuffer} in places where the string buffer was being
35  * used by a single thread (as is generally the case).   Where possible,
36  * it is recommended that this class be used in preference to
37  * {@code StringBuffer} as it will be faster under most implementations.
38  *
39  * <p>The principal operations on a {@code StringBuilder} are the
40  * {@code append} and {@code insert} methods, which are
41  * overloaded so as to accept data of any type. Each effectively
42  * converts a given datum to a string and then appends or inserts the
43  * characters of that string to the string builder. The
44  * {@code append} method always adds these characters at the end
45  * of the builder; the {@code insert} method adds the characters at
46  * a specified point.
47  * <p>
48  * For example, if {@code z} refers to a string builder object
49  * whose current contents are "{@code start}", then
50  * the method call {@code z.append("le")} would cause the string
51  * builder to contain "{@code startle}", whereas
52  * {@code z.insert(4, "le")} would alter the string builder to
53  * contain "{@code starlet}".
54  * <p>
55  * In general, if sb refers to an instance of a {@code StringBuilder},
56  * then {@code sb.append(x)} has the same effect as
57  * {@code sb.insert(sb.length(), x)}.
58  * <p>
59  * Every string builder has a capacity. As long as the length of the
60  * character sequence contained in the string builder does not exceed
61  * the capacity, it is not necessary to allocate a new internal
62  * buffer. If the internal buffer overflows, it is automatically made larger.
63  *
64  * <p>Instances of {@code StringBuilder} are not safe for
65  * use by multiple threads. If such synchronization is required then it is
66  * recommended that {@link java.lang.StringBuffer} be used.
67  *
68  * <p>Unless otherwise noted, passing a {@code null} argument to a constructor
69  * or method in this class will cause a {@link NullPointerException} to be
70  * thrown.
71  *
72  * @apiNote
73  * {@code StringBuilder} implements {@code Comparable} but does not override
74  * {@link Object#equals equals}. Thus, the natural ordering of {@code StringBuilder}
75  * is inconsistent with equals. Care should be exercised if {@code StringBuilder}
76  * objects are used as keys in a {@code SortedMap} or elements in a {@code SortedSet}.
77  * See {@link Comparable}, {@link java.util.SortedMap SortedMap}, or
78  * {@link java.util.SortedSet SortedSet} for more information.
79  *
80  * @author      Michael McCloskey
81  * @see         java.lang.StringBuffer
82  * @see         java.lang.String
83  * @since       1.5
84  */
85 public final class StringBuilder
86     extends AbstractStringBuilder
87     implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
88 {
89 
90     /** use serialVersionUID for interoperability */
91     static final long serialVersionUID = 4383685877147921099L;
92 
93     /**
94      * Constructs a string builder with no characters in it and an
95      * initial capacity of 16 characters.
96      */
97     @HotSpotIntrinsicCandidate
StringBuilder()98     public StringBuilder() {
99         super(16);
100     }
101 
102     /**
103      * Constructs a string builder with no characters in it and an
104      * initial capacity specified by the {@code capacity} argument.
105      *
106      * @param      capacity  the initial capacity.
107      * @throws     NegativeArraySizeException  if the {@code capacity}
108      *               argument is less than {@code 0}.
109      */
110     @HotSpotIntrinsicCandidate
StringBuilder(int capacity)111     public StringBuilder(int capacity) {
112         super(capacity);
113     }
114 
115     /**
116      * Constructs a string builder initialized to the contents of the
117      * specified string. The initial capacity of the string builder is
118      * {@code 16} plus the length of the string argument.
119      *
120      * @param   str   the initial contents of the buffer.
121      */
122     @HotSpotIntrinsicCandidate
StringBuilder(String str)123     public StringBuilder(String str) {
124         super(str.length() + 16);
125         append(str);
126     }
127 
128     /**
129      * Constructs a string builder that contains the same characters
130      * as the specified {@code CharSequence}. The initial capacity of
131      * the string builder is {@code 16} plus the length of the
132      * {@code CharSequence} argument.
133      *
134      * @param      seq   the sequence to copy.
135      */
StringBuilder(CharSequence seq)136     public StringBuilder(CharSequence seq) {
137         this(seq.length() + 16);
138         append(seq);
139     }
140 
141     /**
142      * Compares two {@code StringBuilder} instances lexicographically. This method
143      * follows the same rules for lexicographical comparison as defined in the
144      * {@linkplain java.lang.CharSequence#compare(java.lang.CharSequence,
145      * java.lang.CharSequence)  CharSequence.compare(this, another)} method.
146      *
147      * <p>
148      * For finer-grained, locale-sensitive String comparison, refer to
149      * {@link java.text.Collator}.
150      *
151      * @param another the {@code StringBuilder} to be compared with
152      *
153      * @return  the value {@code 0} if this {@code StringBuilder} contains the same
154      * character sequence as that of the argument {@code StringBuilder}; a negative integer
155      * if this {@code StringBuilder} is lexicographically less than the
156      * {@code StringBuilder} argument; or a positive integer if this {@code StringBuilder}
157      * is lexicographically greater than the {@code StringBuilder} argument.
158      *
159      * @since 11
160      */
161     @Override
compareTo(StringBuilder another)162     public int compareTo(StringBuilder another) {
163         return super.compareTo(another);
164     }
165 
166     @Override
append(Object obj)167     public StringBuilder append(Object obj) {
168         return append(String.valueOf(obj));
169     }
170 
171     @Override
172     @HotSpotIntrinsicCandidate
append(String str)173     public StringBuilder append(String str) {
174         super.append(str);
175         return this;
176     }
177 
178     /**
179      * Appends the specified {@code StringBuffer} to this sequence.
180      * <p>
181      * The characters of the {@code StringBuffer} argument are appended,
182      * in order, to this sequence, increasing the
183      * length of this sequence by the length of the argument.
184      * If {@code sb} is {@code null}, then the four characters
185      * {@code "null"} are appended to this sequence.
186      * <p>
187      * Let <i>n</i> be the length of this character sequence just prior to
188      * execution of the {@code append} method. Then the character at index
189      * <i>k</i> in the new character sequence is equal to the character at
190      * index <i>k</i> in the old character sequence, if <i>k</i> is less than
191      * <i>n</i>; otherwise, it is equal to the character at index <i>k-n</i>
192      * in the argument {@code sb}.
193      *
194      * @param   sb   the {@code StringBuffer} to append.
195      * @return  a reference to this object.
196      */
append(StringBuffer sb)197     public StringBuilder append(StringBuffer sb) {
198         super.append(sb);
199         return this;
200     }
201 
202     @Override
append(CharSequence s)203     public StringBuilder append(CharSequence s) {
204         super.append(s);
205         return this;
206     }
207 
208     /**
209      * @throws     IndexOutOfBoundsException {@inheritDoc}
210      */
211     @Override
append(CharSequence s, int start, int end)212     public StringBuilder append(CharSequence s, int start, int end) {
213         super.append(s, start, end);
214         return this;
215     }
216 
217     @Override
append(char[] str)218     public StringBuilder append(char[] str) {
219         super.append(str);
220         return this;
221     }
222 
223     /**
224      * @throws IndexOutOfBoundsException {@inheritDoc}
225      */
226     @Override
append(char[] str, int offset, int len)227     public StringBuilder append(char[] str, int offset, int len) {
228         super.append(str, offset, len);
229         return this;
230     }
231 
232     @Override
append(boolean b)233     public StringBuilder append(boolean b) {
234         super.append(b);
235         return this;
236     }
237 
238     @Override
239     @HotSpotIntrinsicCandidate
append(char c)240     public StringBuilder append(char c) {
241         super.append(c);
242         return this;
243     }
244 
245     @Override
246     @HotSpotIntrinsicCandidate
append(int i)247     public StringBuilder append(int i) {
248         super.append(i);
249         return this;
250     }
251 
252     @Override
append(long lng)253     public StringBuilder append(long lng) {
254         super.append(lng);
255         return this;
256     }
257 
258     @Override
append(float f)259     public StringBuilder append(float f) {
260         super.append(f);
261         return this;
262     }
263 
264     @Override
append(double d)265     public StringBuilder append(double d) {
266         super.append(d);
267         return this;
268     }
269 
270     /**
271      * @since 1.5
272      */
273     @Override
appendCodePoint(int codePoint)274     public StringBuilder appendCodePoint(int codePoint) {
275         super.appendCodePoint(codePoint);
276         return this;
277     }
278 
279     /**
280      * @throws StringIndexOutOfBoundsException {@inheritDoc}
281      */
282     @Override
delete(int start, int end)283     public StringBuilder delete(int start, int end) {
284         super.delete(start, end);
285         return this;
286     }
287 
288     /**
289      * @throws StringIndexOutOfBoundsException {@inheritDoc}
290      */
291     @Override
deleteCharAt(int index)292     public StringBuilder deleteCharAt(int index) {
293         super.deleteCharAt(index);
294         return this;
295     }
296 
297     /**
298      * @throws StringIndexOutOfBoundsException {@inheritDoc}
299      */
300     @Override
replace(int start, int end, String str)301     public StringBuilder replace(int start, int end, String str) {
302         super.replace(start, end, str);
303         return this;
304     }
305 
306     /**
307      * @throws StringIndexOutOfBoundsException {@inheritDoc}
308      */
309     @Override
insert(int index, char[] str, int offset, int len)310     public StringBuilder insert(int index, char[] str, int offset,
311                                 int len)
312     {
313         super.insert(index, str, offset, len);
314         return this;
315     }
316 
317     /**
318      * @throws StringIndexOutOfBoundsException {@inheritDoc}
319      */
320     @Override
insert(int offset, Object obj)321     public StringBuilder insert(int offset, Object obj) {
322             super.insert(offset, obj);
323             return this;
324     }
325 
326     /**
327      * @throws StringIndexOutOfBoundsException {@inheritDoc}
328      */
329     @Override
insert(int offset, String str)330     public StringBuilder insert(int offset, String str) {
331         super.insert(offset, str);
332         return this;
333     }
334 
335     /**
336      * @throws StringIndexOutOfBoundsException {@inheritDoc}
337      */
338     @Override
insert(int offset, char[] str)339     public StringBuilder insert(int offset, char[] str) {
340         super.insert(offset, str);
341         return this;
342     }
343 
344     /**
345      * @throws IndexOutOfBoundsException {@inheritDoc}
346      */
347     @Override
insert(int dstOffset, CharSequence s)348     public StringBuilder insert(int dstOffset, CharSequence s) {
349             super.insert(dstOffset, s);
350             return this;
351     }
352 
353     /**
354      * @throws IndexOutOfBoundsException {@inheritDoc}
355      */
356     @Override
insert(int dstOffset, CharSequence s, int start, int end)357     public StringBuilder insert(int dstOffset, CharSequence s,
358                                 int start, int end)
359     {
360         super.insert(dstOffset, s, start, end);
361         return this;
362     }
363 
364     /**
365      * @throws StringIndexOutOfBoundsException {@inheritDoc}
366      */
367     @Override
insert(int offset, boolean b)368     public StringBuilder insert(int offset, boolean b) {
369         super.insert(offset, b);
370         return this;
371     }
372 
373     /**
374      * @throws IndexOutOfBoundsException {@inheritDoc}
375      */
376     @Override
insert(int offset, char c)377     public StringBuilder insert(int offset, char c) {
378         super.insert(offset, c);
379         return this;
380     }
381 
382     /**
383      * @throws StringIndexOutOfBoundsException {@inheritDoc}
384      */
385     @Override
insert(int offset, int i)386     public StringBuilder insert(int offset, int i) {
387         super.insert(offset, i);
388         return this;
389     }
390 
391     /**
392      * @throws StringIndexOutOfBoundsException {@inheritDoc}
393      */
394     @Override
insert(int offset, long l)395     public StringBuilder insert(int offset, long l) {
396         super.insert(offset, l);
397         return this;
398     }
399 
400     /**
401      * @throws StringIndexOutOfBoundsException {@inheritDoc}
402      */
403     @Override
insert(int offset, float f)404     public StringBuilder insert(int offset, float f) {
405         super.insert(offset, f);
406         return this;
407     }
408 
409     /**
410      * @throws StringIndexOutOfBoundsException {@inheritDoc}
411      */
412     @Override
insert(int offset, double d)413     public StringBuilder insert(int offset, double d) {
414         super.insert(offset, d);
415         return this;
416     }
417 
418     @Override
indexOf(String str)419     public int indexOf(String str) {
420         return super.indexOf(str);
421     }
422 
423     @Override
indexOf(String str, int fromIndex)424     public int indexOf(String str, int fromIndex) {
425         return super.indexOf(str, fromIndex);
426     }
427 
428     @Override
lastIndexOf(String str)429     public int lastIndexOf(String str) {
430         return super.lastIndexOf(str);
431     }
432 
433     @Override
lastIndexOf(String str, int fromIndex)434     public int lastIndexOf(String str, int fromIndex) {
435         return super.lastIndexOf(str, fromIndex);
436     }
437 
438     @Override
reverse()439     public StringBuilder reverse() {
440         super.reverse();
441         return this;
442     }
443 
444     @Override
445     @HotSpotIntrinsicCandidate
toString()446     public String toString() {
447         // Create a copy, don't share the array
448         return isLatin1() ? StringLatin1.newString(value, 0, count)
449                           : StringUTF16.newString(value, 0, count);
450     }
451 
452     /**
453      * Save the state of the {@code StringBuilder} instance to a stream
454      * (that is, serialize it).
455      *
456      * @serialData the number of characters currently stored in the string
457      *             builder ({@code int}), followed by the characters in the
458      *             string builder ({@code char[]}).   The length of the
459      *             {@code char} array may be greater than the number of
460      *             characters currently stored in the string builder, in which
461      *             case extra characters are ignored.
462      */
writeObject(java.io.ObjectOutputStream s)463     private void writeObject(java.io.ObjectOutputStream s)
464         throws java.io.IOException {
465         s.defaultWriteObject();
466         s.writeInt(count);
467         char[] val = new char[capacity()];
468         if (isLatin1()) {
469             StringLatin1.getChars(value, 0, count, val, 0);
470         } else {
471             StringUTF16.getChars(value, 0, count, val, 0);
472         }
473         s.writeObject(val);
474     }
475 
476     /**
477      * readObject is called to restore the state of the StringBuffer from
478      * a stream.
479      */
readObject(java.io.ObjectInputStream s)480     private void readObject(java.io.ObjectInputStream s)
481         throws java.io.IOException, ClassNotFoundException {
482         s.defaultReadObject();
483         count = s.readInt();
484         char[] val = (char[]) s.readObject();
485         initBytes(val, 0, val.length);
486     }
487 
488 }
489