1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This code is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 only, as
8  * published by the Free Software Foundation.  Oracle designates this
9  * particular file as subject to the "Classpath" exception as provided
10  * by Oracle in the LICENSE file that accompanied this code.
11  *
12  * This code is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15  * version 2 for more details (a copy is included in the LICENSE file that
16  * accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License version
19  * 2 along with this work; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23  * or visit www.oracle.com if you need additional information or have any
24  * questions.
25  */
26 
27 package java.lang;
28 
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  * @author      Michael McCloskey
73  * @see         java.lang.StringBuffer
74  * @see         java.lang.String
75  * @since       1.5
76  */
77 public final class StringBuilder
78     extends AbstractStringBuilder
79     implements java.io.Serializable, CharSequence
80 {
81 
82     /** use serialVersionUID for interoperability */
83     static final long serialVersionUID = 4383685877147921099L;
84 
85     /**
86      * Constructs a string builder with no characters in it and an
87      * initial capacity of 16 characters.
88      */
StringBuilder()89     public StringBuilder() {
90         super(16);
91     }
92 
93     /**
94      * Constructs a string builder with no characters in it and an
95      * initial capacity specified by the {@code capacity} argument.
96      *
97      * @param      capacity  the initial capacity.
98      * @throws     NegativeArraySizeException  if the {@code capacity}
99      *               argument is less than {@code 0}.
100      */
StringBuilder(int capacity)101     public StringBuilder(int capacity) {
102         super(capacity);
103     }
104 
105     /**
106      * Constructs a string builder initialized to the contents of the
107      * specified string. The initial capacity of the string builder is
108      * {@code 16} plus the length of the string argument.
109      *
110      * @param   str   the initial contents of the buffer.
111      */
StringBuilder(String str)112     public StringBuilder(String str) {
113         super(str.length() + 16);
114         append(str);
115     }
116 
117     /**
118      * Constructs a string builder that contains the same characters
119      * as the specified {@code CharSequence}. The initial capacity of
120      * the string builder is {@code 16} plus the length of the
121      * {@code CharSequence} argument.
122      *
123      * @param      seq   the sequence to copy.
124      */
StringBuilder(CharSequence seq)125     public StringBuilder(CharSequence seq) {
126         this(seq.length() + 16);
127         append(seq);
128     }
129 
130     @Override
append(Object obj)131     public StringBuilder append(Object obj) {
132         return append(String.valueOf(obj));
133     }
134 
135     @Override
append(String str)136     public StringBuilder append(String str) {
137         super.append(str);
138         return this;
139     }
140 
141     /**
142      * Appends the specified {@code StringBuffer} to this sequence.
143      * <p>
144      * The characters of the {@code StringBuffer} argument are appended,
145      * in order, to this sequence, increasing the
146      * length of this sequence by the length of the argument.
147      * If {@code sb} is {@code null}, then the four characters
148      * {@code "null"} are appended to this sequence.
149      * <p>
150      * Let <i>n</i> be the length of this character sequence just prior to
151      * execution of the {@code append} method. Then the character at index
152      * <i>k</i> in the new character sequence is equal to the character at
153      * index <i>k</i> in the old character sequence, if <i>k</i> is less than
154      * <i>n</i>; otherwise, it is equal to the character at index <i>k-n</i>
155      * in the argument {@code sb}.
156      *
157      * @param   sb   the {@code StringBuffer} to append.
158      * @return  a reference to this object.
159      */
append(StringBuffer sb)160     public StringBuilder append(StringBuffer sb) {
161         super.append(sb);
162         return this;
163     }
164 
165     @Override
append(CharSequence s)166     public StringBuilder append(CharSequence s) {
167         super.append(s);
168         return this;
169     }
170 
171     /**
172      * @throws     IndexOutOfBoundsException {@inheritDoc}
173      */
174     @Override
append(CharSequence s, int start, int end)175     public StringBuilder append(CharSequence s, int start, int end) {
176         super.append(s, start, end);
177         return this;
178     }
179 
180     @Override
append(char[] str)181     public StringBuilder append(char[] str) {
182         super.append(str);
183         return this;
184     }
185 
186     /**
187      * @throws IndexOutOfBoundsException {@inheritDoc}
188      */
189     @Override
append(char[] str, int offset, int len)190     public StringBuilder append(char[] str, int offset, int len) {
191         super.append(str, offset, len);
192         return this;
193     }
194 
195     @Override
append(boolean b)196     public StringBuilder append(boolean b) {
197         super.append(b);
198         return this;
199     }
200 
201     @Override
append(char c)202     public StringBuilder append(char c) {
203         super.append(c);
204         return this;
205     }
206 
207     @Override
append(int i)208     public StringBuilder append(int i) {
209         super.append(i);
210         return this;
211     }
212 
213     @Override
append(long lng)214     public StringBuilder append(long lng) {
215         super.append(lng);
216         return this;
217     }
218 
219     @Override
append(float f)220     public StringBuilder append(float f) {
221         super.append(f);
222         return this;
223     }
224 
225     @Override
append(double d)226     public StringBuilder append(double d) {
227         super.append(d);
228         return this;
229     }
230 
231     /**
232      * @since 1.5
233      */
234     @Override
appendCodePoint(int codePoint)235     public StringBuilder appendCodePoint(int codePoint) {
236         super.appendCodePoint(codePoint);
237         return this;
238     }
239 
240     /**
241      * @throws StringIndexOutOfBoundsException {@inheritDoc}
242      */
243     @Override
delete(int start, int end)244     public StringBuilder delete(int start, int end) {
245         super.delete(start, end);
246         return this;
247     }
248 
249     /**
250      * @throws StringIndexOutOfBoundsException {@inheritDoc}
251      */
252     @Override
deleteCharAt(int index)253     public StringBuilder deleteCharAt(int index) {
254         super.deleteCharAt(index);
255         return this;
256     }
257 
258     /**
259      * @throws StringIndexOutOfBoundsException {@inheritDoc}
260      */
261     @Override
replace(int start, int end, String str)262     public StringBuilder replace(int start, int end, String str) {
263         super.replace(start, end, str);
264         return this;
265     }
266 
267     /**
268      * @throws StringIndexOutOfBoundsException {@inheritDoc}
269      */
270     @Override
insert(int index, char[] str, int offset, int len)271     public StringBuilder insert(int index, char[] str, int offset,
272                                 int len)
273     {
274         super.insert(index, str, offset, len);
275         return this;
276     }
277 
278     /**
279      * @throws StringIndexOutOfBoundsException {@inheritDoc}
280      */
281     @Override
insert(int offset, Object obj)282     public StringBuilder insert(int offset, Object obj) {
283             super.insert(offset, obj);
284             return this;
285     }
286 
287     /**
288      * @throws StringIndexOutOfBoundsException {@inheritDoc}
289      */
290     @Override
insert(int offset, String str)291     public StringBuilder insert(int offset, String str) {
292         super.insert(offset, str);
293         return this;
294     }
295 
296     /**
297      * @throws StringIndexOutOfBoundsException {@inheritDoc}
298      */
299     @Override
insert(int offset, char[] str)300     public StringBuilder insert(int offset, char[] str) {
301         super.insert(offset, str);
302         return this;
303     }
304 
305     /**
306      * @throws IndexOutOfBoundsException {@inheritDoc}
307      */
308     @Override
insert(int dstOffset, CharSequence s)309     public StringBuilder insert(int dstOffset, CharSequence s) {
310             super.insert(dstOffset, s);
311             return this;
312     }
313 
314     /**
315      * @throws IndexOutOfBoundsException {@inheritDoc}
316      */
317     @Override
insert(int dstOffset, CharSequence s, int start, int end)318     public StringBuilder insert(int dstOffset, CharSequence s,
319                                 int start, int end)
320     {
321         super.insert(dstOffset, s, start, end);
322         return this;
323     }
324 
325     /**
326      * @throws StringIndexOutOfBoundsException {@inheritDoc}
327      */
328     @Override
insert(int offset, boolean b)329     public StringBuilder insert(int offset, boolean b) {
330         super.insert(offset, b);
331         return this;
332     }
333 
334     /**
335      * @throws IndexOutOfBoundsException {@inheritDoc}
336      */
337     @Override
insert(int offset, char c)338     public StringBuilder insert(int offset, char c) {
339         super.insert(offset, c);
340         return this;
341     }
342 
343     /**
344      * @throws StringIndexOutOfBoundsException {@inheritDoc}
345      */
346     @Override
insert(int offset, int i)347     public StringBuilder insert(int offset, int i) {
348         super.insert(offset, i);
349         return this;
350     }
351 
352     /**
353      * @throws StringIndexOutOfBoundsException {@inheritDoc}
354      */
355     @Override
insert(int offset, long l)356     public StringBuilder insert(int offset, long l) {
357         super.insert(offset, l);
358         return this;
359     }
360 
361     /**
362      * @throws StringIndexOutOfBoundsException {@inheritDoc}
363      */
364     @Override
insert(int offset, float f)365     public StringBuilder insert(int offset, float f) {
366         super.insert(offset, f);
367         return this;
368     }
369 
370     /**
371      * @throws StringIndexOutOfBoundsException {@inheritDoc}
372      */
373     @Override
insert(int offset, double d)374     public StringBuilder insert(int offset, double d) {
375         super.insert(offset, d);
376         return this;
377     }
378 
379     @Override
indexOf(String str)380     public int indexOf(String str) {
381         return super.indexOf(str);
382     }
383 
384     @Override
indexOf(String str, int fromIndex)385     public int indexOf(String str, int fromIndex) {
386         return super.indexOf(str, fromIndex);
387     }
388 
389     @Override
lastIndexOf(String str)390     public int lastIndexOf(String str) {
391         return super.lastIndexOf(str);
392     }
393 
394     @Override
lastIndexOf(String str, int fromIndex)395     public int lastIndexOf(String str, int fromIndex) {
396         return super.lastIndexOf(str, fromIndex);
397     }
398 
399     @Override
reverse()400     public StringBuilder reverse() {
401         super.reverse();
402         return this;
403     }
404 
405     @Override
toString()406     public String toString() {
407         if (count == 0) {
408             return "";
409         }
410         return StringFactory.newStringFromChars(0, count, value);
411     }
412 
413     /**
414      * Save the state of the {@code StringBuilder} instance to a stream
415      * (that is, serialize it).
416      *
417      * @serialData the number of characters currently stored in the string
418      *             builder ({@code int}), followed by the characters in the
419      *             string builder ({@code char[]}).   The length of the
420      *             {@code char} array may be greater than the number of
421      *             characters currently stored in the string builder, in which
422      *             case extra characters are ignored.
423      */
writeObject(java.io.ObjectOutputStream s)424     private void writeObject(java.io.ObjectOutputStream s)
425         throws java.io.IOException {
426         s.defaultWriteObject();
427         s.writeInt(count);
428         s.writeObject(value);
429     }
430 
431     /**
432      * readObject is called to restore the state of the StringBuffer from
433      * a stream.
434      */
readObject(java.io.ObjectInputStream s)435     private void readObject(java.io.ObjectInputStream s)
436         throws java.io.IOException, ClassNotFoundException {
437         s.defaultReadObject();
438         count = s.readInt();
439         value = (char[]) s.readObject();
440     }
441 
442 }
443