OSDN Git Service

b9ce3c016fc65640b75752fff9d6074e5533406a
[pf3gnuchains/gcc-fork.git] / libjava / java / lang / String.java
1 /* String.java -- immutable character sequences; the object of string literals
2    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3    Free Software Foundation, Inc.
4
5 This file is part of GNU Classpath.
6
7 GNU Classpath is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU Classpath is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Classpath; see the file COPYING.  If not, write to the
19 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301 USA.
21
22 Linking this library statically or dynamically with other modules is
23 making a combined work based on this library.  Thus, the terms and
24 conditions of the GNU General Public License cover the whole
25 combination.
26
27 As a special exception, the copyright holders of this library give you
28 permission to link this library with independent modules to produce an
29 executable, regardless of the license terms of these independent
30 modules, and to copy and distribute the resulting executable under
31 terms of your choice, provided that you also meet, for each linked
32 independent module, the terms and conditions of the license of that
33 module.  An independent module is a module which is not derived from
34 or based on this library.  If you modify this library, you may extend
35 this exception to your version of the library, but you are not
36 obligated to do so.  If you do not wish to do so, delete this
37 exception statement from your version. */
38
39
40 package java.lang;
41
42 import java.io.Serializable;
43 import java.io.UnsupportedEncodingException;
44 import java.util.Comparator;
45 import java.text.Collator;
46 import java.util.Formatter;
47 import java.util.Locale;
48 import java.util.regex.Matcher;
49 import java.util.regex.Pattern;
50 import java.util.regex.PatternSyntaxException;
51
52 /**
53  * Strings represent an immutable set of characters.  All String literals
54  * are instances of this class, and two string literals with the same contents
55  * refer to the same String object.
56  *
57  * <p>This class also includes a number of methods for manipulating the
58  * contents of strings (of course, creating a new object if there are any
59  * changes, as String is immutable). Case mapping relies on Unicode 3.0.0
60  * standards, where some character sequences have a different number of
61  * characters in the uppercase version than the lower case.
62  *
63  * <p>Strings are special, in that they are the only object with an overloaded
64  * operator. When you use '+' with at least one String argument, both
65  * arguments have String conversion performed on them, and another String (not
66  * guaranteed to be unique) results.
67  *
68  * <p>String is special-cased when doing data serialization - rather than
69  * listing the fields of this class, a String object is converted to a string
70  * literal in the object stream.
71  *
72  * @author Paul N. Fisher
73  * @author Eric Blake (ebb9@email.byu.edu)
74  * @author Per Bothner (bothner@cygnus.com)
75  * @author Tom Tromey (tromey@redhat.com)
76  * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
77  * @since 1.0
78  * @status updated to 1.4
79  */
80 public final class String
81   implements Serializable, Comparable<String>, CharSequence
82 {
83   // WARNING: String is a CORE class in the bootstrap cycle. See the comments
84   // in vm/reference/java/lang/Runtime for implications of this fact.
85
86   /**
87    * This is probably not necessary because this class is special cased already
88    * but it will avoid showing up as a discrepancy when comparing SUIDs.
89    */
90   private static final long serialVersionUID = -6849794470754667710L;
91
92   /**
93    * This is the object that holds the characters that make up the
94    * String.  It might be a char[], or it could be String.  It could
95    * even be `this'.  The actual characters can't be located using
96    * pure Java code.
97    * @see #boffset
98    */
99   private Object data;
100
101   /**
102    * This is a <emph>byte</emph> offset of the actual characters from
103    * the start of the character-holding object.  Don't use this field
104    * in Java code.
105    */
106   private int boffset;
107
108   /**
109    * Holds the number of characters in value.  Package visible for use
110    * by trusted code.
111    */
112   int count;
113
114   /**
115    * Caches the result of hashCode().  If this value is zero, the hashcode
116    * is considered uncached (even if 0 is the correct hash value).
117    */
118   private int cachedHashCode;
119
120   /**
121    * An implementation for {@link #CASE_INSENSITIVE_ORDER}.
122    * This must be {@link Serializable}. The class name is dictated by
123    * compatibility with Sun's JDK.
124    */
125   private static final class CaseInsensitiveComparator
126     implements Comparator<String>, Serializable
127   {
128     /**
129      * Compatible with JDK 1.2.
130      */
131     private static final long serialVersionUID = 8575799808933029326L;
132
133     /**
134      * The default private constructor generates unnecessary overhead.
135      */
136     CaseInsensitiveComparator() {}
137
138     /**
139      * Compares to Strings, using
140      * <code>String.compareToIgnoreCase(String)</code>.
141      *
142      * @param o1 the first string
143      * @param o2 the second string
144      * @return &lt; 0, 0, or &gt; 0 depending on the case-insensitive
145      *         comparison of the two strings.
146      * @throws NullPointerException if either argument is null
147      * @throws ClassCastException if either argument is not a String
148      * @see #compareToIgnoreCase(String)
149      */
150     public int compare(String o1, String o2)
151     {
152       return o1.compareToIgnoreCase(o2);
153     }
154   } // class CaseInsensitiveComparator
155
156   /**
157    * A Comparator that uses <code>String.compareToIgnoreCase(String)</code>.
158    * This comparator is {@link Serializable}. Note that it ignores Locale,
159    * for that, you want a Collator.
160    *
161    * @see Collator#compare(String, String)
162    * @since 1.2
163    */
164   public static final Comparator<String> CASE_INSENSITIVE_ORDER
165     = new CaseInsensitiveComparator();
166
167   /**
168    * Creates an empty String (length 0). Unless you really need a new object,
169    * consider using <code>""</code> instead.
170    */
171   public String()
172   {
173     data = "".data;
174     boffset = 0;
175     count = 0;
176   }
177
178   /**
179    * Copies the contents of a String to a new String. Since Strings are
180    * immutable, only a shallow copy is performed.
181    *
182    * @param str String to copy
183    * @throws NullPointerException if value is null
184    */
185   public String(String str)
186   {
187     data = str.data;
188     boffset = str.boffset;
189     count = str.count;
190     cachedHashCode = str.cachedHashCode;
191   }
192
193   /**
194    * Creates a new String using the character sequence of the char array.
195    * Subsequent changes to data do not affect the String.
196    *
197    * @param data char array to copy
198    * @throws NullPointerException if data is null
199    */
200   public String(char[] data)
201   {
202     init(data, 0, data.length, false);
203   }
204
205   /**
206    * Creates a new String using the character sequence of a subarray of
207    * characters. The string starts at offset, and copies count chars.
208    * Subsequent changes to data do not affect the String.
209    *
210    * @param data char array to copy
211    * @param offset position (base 0) to start copying out of data
212    * @param count the number of characters from data to copy
213    * @throws NullPointerException if data is null
214    * @throws IndexOutOfBoundsException if (offset &lt; 0 || count &lt; 0
215    *         || offset + count &lt; 0 (overflow)
216    *         || offset + count &gt; data.length)
217    *         (while unspecified, this is a StringIndexOutOfBoundsException)
218    */
219   public String(char[] data, int offset, int count)
220   {
221     init(data, offset, count, false);
222   }
223
224   /**
225    * Creates a new String using an 8-bit array of integer values, starting at
226    * an offset, and copying up to the count. Each character c, using
227    * corresponding byte b, is created in the new String as if by performing:
228    *
229    * <pre>
230    * c = (char) (((hibyte &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff))
231    * </pre>
232    *
233    * @param ascii array of integer values
234    * @param hibyte top byte of each Unicode character
235    * @param offset position (base 0) to start copying out of ascii
236    * @param count the number of characters from ascii to copy
237    * @throws NullPointerException if ascii is null
238    * @throws IndexOutOfBoundsException if (offset &lt; 0 || count &lt; 0
239    *         || offset + count &lt; 0 (overflow)
240    *         || offset + count &gt; ascii.length)
241    *         (while unspecified, this is a StringIndexOutOfBoundsException)
242    * @see #String(byte[])
243    * @see #String(byte[], String)
244    * @see #String(byte[], int, int)
245    * @see #String(byte[], int, int, String)
246    * @deprecated use {@link #String(byte[], int, int, String)} to perform
247    *             correct encoding
248    */
249   public String(byte[] ascii, int hibyte, int offset, int count)
250   {
251     init(ascii, hibyte, offset, count);
252   }
253
254   /**
255    * Creates a new String using an 8-bit array of integer values. Each
256    * character c, using corresponding byte b, is created in the new String
257    * as if by performing:
258    *
259    * <pre>
260    * c = (char) (((hibyte &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff))
261    * </pre>
262    *
263    * @param ascii array of integer values
264    * @param hibyte top byte of each Unicode character
265    * @throws NullPointerException if ascii is null
266    * @see #String(byte[])
267    * @see #String(byte[], String)
268    * @see #String(byte[], int, int)
269    * @see #String(byte[], int, int, String)
270    * @see #String(byte[], int, int, int)
271    * @deprecated use {@link #String(byte[], String)} to perform
272    *             correct encoding
273    */
274   public String(byte[] ascii, int hibyte)
275   {
276     init(ascii, hibyte, 0, ascii.length);
277   }
278
279   /**
280    * Creates a new String using the portion of the byte array starting at the
281    * offset and ending at offset + count. Uses the specified encoding type
282    * to decode the byte array, so the resulting string may be longer or
283    * shorter than the byte array. For more decoding control, use
284    * {@link java.nio.charset.CharsetDecoder}, and for valid character sets,
285    * see {@link java.nio.charset.Charset}. The behavior is not specified if
286    * the decoder encounters invalid characters; this implementation throws
287    * an Error.
288    *
289    * @param data byte array to copy
290    * @param offset the offset to start at
291    * @param count the number of bytes in the array to use
292    * @param encoding the name of the encoding to use
293    * @throws NullPointerException if data or encoding is null
294    * @throws IndexOutOfBoundsException if offset or count is incorrect
295    *         (while unspecified, this is a StringIndexOutOfBoundsException)
296    * @throws UnsupportedEncodingException if encoding is not found
297    * @throws Error if the decoding fails
298    * @since 1.1
299    */
300   public String(byte[] data, int offset, int count, String encoding)
301     throws UnsupportedEncodingException
302   {
303     init (data, offset, count, encoding);
304   }
305
306   /**
307    * Creates a new String using the byte array. Uses the specified encoding
308    * type to decode the byte array, so the resulting string may be longer or
309    * shorter than the byte array. For more decoding control, use
310    * {@link java.nio.charset.CharsetDecoder}, and for valid character sets,
311    * see {@link java.nio.charset.Charset}. The behavior is not specified if
312    * the decoder encounters invalid characters; this implementation throws
313    * an Error.
314    *
315    * @param data byte array to copy
316    * @param encoding the name of the encoding to use
317    * @throws NullPointerException if data or encoding is null
318    * @throws UnsupportedEncodingException if encoding is not found
319    * @throws Error if the decoding fails
320    * @see #String(byte[], int, int, String)
321    * @since 1.1
322    */
323   public String(byte[] data, String encoding)
324     throws UnsupportedEncodingException
325   {
326     this(data, 0, data.length, encoding);
327   }
328
329   /**
330    * Creates a new String using the portion of the byte array starting at the
331    * offset and ending at offset + count. Uses the encoding of the platform's
332    * default charset, so the resulting string may be longer or shorter than
333    * the byte array. For more decoding control, use
334    * {@link java.nio.charset.CharsetDecoder}.  The behavior is not specified
335    * if the decoder encounters invalid characters; this implementation throws
336    * an Error.
337    *
338    * @param data byte array to copy
339    * @param offset the offset to start at
340    * @param count the number of bytes in the array to use
341    * @throws NullPointerException if data is null
342    * @throws IndexOutOfBoundsException if offset or count is incorrect
343    * @throws Error if the decoding fails
344    * @see #String(byte[], int, int, String)
345    * @since 1.1
346    */
347   public String(byte[] data, int offset, int count)
348   {
349     try
350       {
351         init (data, offset, count,
352               System.getProperty("file.encoding", "8859_1"));
353       }
354     catch (UnsupportedEncodingException x1)
355       {
356         // Maybe the default encoding is bad.
357         try
358           {
359             init (data, offset, count, "8859_1");
360           }
361         catch (UnsupportedEncodingException x2)
362           {
363             // We know this can't happen.
364           }
365       }
366   }
367
368   /**
369    * Creates a new String using the byte array. Uses the encoding of the
370    * platform's default charset, so the resulting string may be longer or
371    * shorter than the byte array. For more decoding control, use
372    * {@link java.nio.charset.CharsetDecoder}.  The behavior is not specified
373    * if the decoder encounters invalid characters; this implementation throws
374    * an Error.
375    *
376    * @param data byte array to copy
377    * @throws NullPointerException if data is null
378    * @throws Error if the decoding fails
379    * @see #String(byte[], int, int)
380    * @see #String(byte[], int, int, String)
381    * @since 1.1
382    */
383   public String(byte[] data)
384   {
385     this(data, 0, data.length);
386   }
387
388   /**
389    * Creates a new String using the character sequence represented by
390    * the StringBuffer. Subsequent changes to buf do not affect the String.
391    *
392    * @param buffer StringBuffer to copy
393    * @throws NullPointerException if buffer is null
394    */
395   public String(StringBuffer buffer)
396   {
397     synchronized (buffer)
398       {
399         // Share unless buffer is 3/4 empty.
400         boolean should_copy = ((buffer.count << 2) < buffer.value.length);
401         if (! should_copy)
402           buffer.shared = true;
403         init (buffer.value, 0, buffer.count, ! should_copy);
404       }
405   }
406
407   /**
408    * Creates a new String using the character sequence represented by
409    * the StringBuilder. Subsequent changes to buf do not affect the String.
410    *
411    * @param buffer StringBuilder to copy
412    * @throws NullPointerException if buffer is null
413    */
414   public String(StringBuilder buffer)
415   {
416     this(buffer.value, 0, buffer.count);
417   }
418
419   /**
420    * Special constructor which can share an array when safe to do so.
421    *
422    * @param data the characters to copy
423    * @param offset the location to start from
424    * @param count the number of characters to use
425    * @param dont_copy true if the array is trusted, and need not be copied
426    * @throws NullPointerException if chars is null
427    * @throws StringIndexOutOfBoundsException if bounds check fails
428    */
429   String(char[] data, int offset, int count, boolean dont_copy)
430   {
431     init(data, offset, count, dont_copy);
432   }
433
434   // This is used by gnu.gcj.runtime.StringBuffer, so it must have
435   // package-private protection.  It is accessed via CNI and so avoids
436   // ordinary protection mechanisms.
437   String(gnu.gcj.runtime.StringBuffer buffer)
438   {
439     // No need to synchronize or mark the buffer, since we know it is
440     // only used once.
441     init (buffer);
442   }
443
444   /**
445    * Returns the number of characters contained in this String.
446    *
447    * @return the length of this String
448    */
449   public int length()
450   {
451     return count;
452   }
453
454   /**
455    * Returns the character located at the specified index within this String.
456    *
457    * @param index position of character to return (base 0)
458    * @return character located at position index
459    * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt;= length()
460    *         (while unspecified, this is a StringIndexOutOfBoundsException)
461    */
462   public native char charAt(int index);
463
464   /**
465    * Get the code point at the specified index.  This is like #charAt(int),
466    * but if the character is the start of a surrogate pair, and the
467    * following character completes the pair, then the corresponding
468    * supplementary code point is returned.
469    * @param index the index of the codepoint to get, starting at 0
470    * @return the codepoint at the specified index
471    * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
472    * @since 1.5
473    */
474   public synchronized int codePointAt(int index)
475   {
476     // Use the CharSequence overload as we get better range checking
477     // this way.
478     return Character.codePointAt(this, index);
479   }
480
481   /**
482    * Get the code point before the specified index.  This is like
483    * #codePointAt(int), but checks the characters at <code>index-1</code> and
484    * <code>index-2</code> to see if they form a supplementary code point.
485    * @param index the index just past the codepoint to get, starting at 0
486    * @return the codepoint at the specified index
487    * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
488    *         (while unspecified, this is a StringIndexOutOfBoundsException)
489    * @since 1.5
490    */
491   public synchronized int codePointBefore(int index)
492   {
493     // Use the CharSequence overload as we get better range checking
494     // this way.
495     return Character.codePointBefore(this, index);
496   }
497
498   /**
499    * Copies characters from this String starting at a specified start index,
500    * ending at a specified stop index, to a character array starting at
501    * a specified destination begin index.
502    *
503    * @param srcBegin index to begin copying characters from this String
504    * @param srcEnd index after the last character to be copied from this String
505    * @param dst character array which this String is copied into
506    * @param dstBegin index to start writing characters into dst
507    * @throws NullPointerException if dst is null
508    * @throws IndexOutOfBoundsException if any indices are out of bounds
509    *         (while unspecified, source problems cause a
510    *         StringIndexOutOfBoundsException, and dst problems cause an
511    *         ArrayIndexOutOfBoundsException)
512    */
513   public native void getChars(int srcBegin, int srcEnd,
514                               char[] dst, int dstBegin);
515
516   /**
517    * Copies the low byte of each character from this String starting at a
518    * specified start index, ending at a specified stop index, to a byte array
519    * starting at a specified destination begin index.
520    *
521    * @param srcBegin index to being copying characters from this String
522    * @param srcEnd index after the last character to be copied from this String
523    * @param dst byte array which each low byte of this String is copied into
524    * @param dstBegin index to start writing characters into dst
525    * @throws NullPointerException if dst is null and copy length is non-zero
526    * @throws IndexOutOfBoundsException if any indices are out of bounds
527    *         (while unspecified, source problems cause a
528    *         StringIndexOutOfBoundsException, and dst problems cause an
529    *         ArrayIndexOutOfBoundsException)
530    * @see #getBytes()
531    * @see #getBytes(String)
532    * @deprecated use {@link #getBytes()}, which uses a char to byte encoder
533    */
534   public native void getBytes(int srcBegin, int srcEnd,
535                               byte[] dst, int dstBegin);
536
537   /**
538    * Converts the Unicode characters in this String to a byte array. Uses the
539    * specified encoding method, so the result may be longer or shorter than
540    * the String. For more encoding control, use
541    * {@link java.nio.charset.CharsetEncoder}, and for valid character sets,
542    * see {@link java.nio.charset.Charset}. The behavior is not specified if
543    * the encoder encounters a problem; this implementation returns null.
544    *
545    * @param enc encoding name
546    * @return the resulting byte array, or null on a problem
547    * @throws NullPointerException if enc is null
548    * @throws UnsupportedEncodingException if encoding is not supported
549    * @since 1.1
550    */
551   public native byte[] getBytes(String enc)
552     throws UnsupportedEncodingException;
553
554   /**
555    * Converts the Unicode characters in this String to a byte array. Uses the
556    * encoding of the platform's default charset, so the result may be longer
557    * or shorter than the String. For more encoding control, use
558    * {@link java.nio.charset.CharsetEncoder}.  The behavior is not specified if
559    * the encoder encounters a problem; this implementation returns null.
560    *
561    * @return the resulting byte array, or null on a problem
562    * @since 1.1
563    */
564   public byte[] getBytes()
565   {
566     try
567       {
568         return getBytes (System.getProperty("file.encoding", "8859_1"));
569       }
570     catch (UnsupportedEncodingException x)
571       {
572         // This probably shouldn't happen, but could if file.encoding
573         // is somehow changed to a value we don't understand.
574         try
575           {
576             return getBytes ("8859_1");
577           }
578         catch (UnsupportedEncodingException x2)
579           {
580             // This really shouldn't happen, because the 8859_1
581             // encoding should always be available.
582             throw new InternalError ("couldn't find 8859_1 encoder");
583           }
584       }
585   }
586
587   /**
588    * Predicate which compares anObject to this. This is true only for Strings
589    * with the same character sequence.
590    *
591    * @param anObject the object to compare
592    * @return true if anObject is semantically equal to this
593    * @see #compareTo(String)
594    * @see #equalsIgnoreCase(String)
595    */
596   public native boolean equals(Object anObject);
597
598   /**
599    * Compares the given StringBuffer to this String. This is true if the
600    * StringBuffer has the same content as this String at this moment.
601    *
602    * @param buffer the StringBuffer to compare to
603    * @return true if StringBuffer has the same character sequence
604    * @throws NullPointerException if the given StringBuffer is null
605    * @since 1.4
606    */
607   public native boolean contentEquals(StringBuffer buffer);
608
609   /**
610    * Compares the given CharSequence to this String. This is true if
611    * the CharSequence has the same content as this String at this
612    * moment.
613    *
614    * @param seq the CharSequence to compare to
615    * @return true if CharSequence has the same character sequence
616    * @throws NullPointerException if the given CharSequence is null
617    * @since 1.5
618    */
619   public native boolean contentEquals(CharSequence seq);
620
621   /**
622    * Compares a String to this String, ignoring case. This does not handle
623    * multi-character capitalization exceptions; instead the comparison is
624    * made on a character-by-character basis, and is true if:<br><ul>
625    * <li><code>c1 == c2</code></li>
626    * <li><code>Character.toUpperCase(c1)
627    *     == Character.toUpperCase(c2)</code></li>
628    * <li><code>Character.toLowerCase(c1)
629    *     == Character.toLowerCase(c2)</code></li>
630    * </ul>
631    *
632    * @param anotherString String to compare to this String
633    * @return true if anotherString is equal, ignoring case
634    * @see #equals(Object)
635    * @see Character#toUpperCase(char)
636    * @see Character#toLowerCase(char)
637    */
638   public native boolean equalsIgnoreCase(String anotherString);
639
640   /**
641    * Compares this String and another String (case sensitive,
642    * lexicographically). The result is less than 0 if this string sorts
643    * before the other, 0 if they are equal, and greater than 0 otherwise.
644    * After any common starting sequence is skipped, the result is
645    * <code>this.charAt(k) - anotherString.charAt(k)</code> if both strings
646    * have characters remaining, or
647    * <code>this.length() - anotherString.length()</code> if one string is
648    * a subsequence of the other.
649    *
650    * @param anotherString the String to compare against
651    * @return the comparison
652    * @throws NullPointerException if anotherString is null
653    */
654   public int compareTo(String anotherString)
655   {
656     return nativeCompareTo(anotherString);
657   }
658
659   /**
660    * The native implementation of compareTo(). Must be named different
661    * since cni doesn't understand the bridge method generated from
662    * the compareTo() method because of the Comparable<String> interface.
663    */
664   private native int nativeCompareTo(String anotherString);
665
666   /**
667    * Compares this String and another String (case insensitive). This
668    * comparison is <em>similar</em> to equalsIgnoreCase, in that it ignores
669    * locale and multi-characater capitalization, and compares characters
670    * after performing
671    * <code>Character.toLowerCase(Character.toUpperCase(c))</code> on each
672    * character of the string. This is unsatisfactory for locale-based
673    * comparison, in which case you should use {@link java.text.Collator}.
674    *
675    * @param str the string to compare against
676    * @return the comparison
677    * @see Collator#compare(String, String)
678    * @since 1.2
679    */
680   public int compareToIgnoreCase(String str)
681   {
682     return this.toUpperCase().toLowerCase().compareTo(
683      str.toUpperCase().toLowerCase());
684   }  
685
686   /**
687    * Predicate which determines if this String matches another String
688    * starting at a specified offset for each String and continuing
689    * for a specified length. Indices out of bounds are harmless, and give
690    * a false result.
691    *
692    * @param toffset index to start comparison at for this String
693    * @param other String to compare region to this String
694    * @param ooffset index to start comparison at for other
695    * @param len number of characters to compare
696    * @return true if regions match (case sensitive)
697    * @throws NullPointerException if other is null
698    */
699   public native boolean regionMatches(int toffset,
700                                       String other, int ooffset, int len);
701
702   /**
703    * Predicate which determines if this String matches another String
704    * starting at a specified offset for each String and continuing
705    * for a specified length, optionally ignoring case. Indices out of bounds
706    * are harmless, and give a false result. Case comparisons are based on
707    * <code>Character.toLowerCase()</code> and
708    * <code>Character.toUpperCase()</code>, not on multi-character
709    * capitalization expansions.
710    *
711    * @param ignoreCase true if case should be ignored in comparision
712    * @param toffset index to start comparison at for this String
713    * @param other String to compare region to this String
714    * @param ooffset index to start comparison at for other
715    * @param len number of characters to compare
716    * @return true if regions match, false otherwise
717    * @throws NullPointerException if other is null
718    */
719   public native boolean regionMatches(boolean ignoreCase, int toffset,
720                                       String other, int ooffset, int len);
721
722   /**
723    * Predicate which determines if this String contains the given prefix,
724    * beginning comparison at toffset. The result is false if toffset is
725    * negative or greater than this.length(), otherwise it is the same as
726    * <code>this.substring(toffset).startsWith(prefix)</code>.
727    *
728    * @param prefix String to compare
729    * @param toffset offset for this String where comparison starts
730    * @return true if this String starts with prefix
731    * @throws NullPointerException if prefix is null
732    * @see #regionMatches(boolean, int, String, int, int)
733    */
734   public native boolean startsWith(String prefix, int toffset);
735
736   /**
737    * Predicate which determines if this String starts with a given prefix.
738    * If the prefix is an empty String, true is returned.
739    *
740    * @param prefix String to compare
741    * @return true if this String starts with the prefix
742    * @throws NullPointerException if prefix is null
743    * @see #startsWith(String, int)
744    */
745   public boolean startsWith(String prefix)
746   {
747     return startsWith (prefix, 0);
748   }
749
750   /**
751    * Predicate which determines if this String ends with a given suffix.
752    * If the suffix is an empty String, true is returned.
753    *
754    * @param suffix String to compare
755    * @return true if this String ends with the suffix
756    * @throws NullPointerException if suffix is null
757    * @see #regionMatches(boolean, int, String, int, int)
758    */
759   public boolean endsWith(String suffix)
760   {
761     return regionMatches (this.count - suffix.count, suffix, 0, suffix.count);
762   }
763
764   /**
765    * Computes the hashcode for this String. This is done with int arithmetic,
766    * where ** represents exponentiation, by this formula:<br>
767    * <code>s[0]*31**(n-1) + s[1]*31**(n-2) + ... + s[n-1]</code>.
768    *
769    * @return hashcode value of this String
770    */
771   public native int hashCode();
772
773   /**
774    * Finds the first instance of a character in this String.
775    *
776    * @param ch character to find
777    * @return location (base 0) of the character, or -1 if not found
778    */
779   public int indexOf(int ch)
780   {
781     return indexOf(ch, 0);
782   }
783
784   /**
785    * Finds the first instance of a character in this String, starting at
786    * a given index.  If starting index is less than 0, the search
787    * starts at the beginning of this String.  If the starting index
788    * is greater than the length of this String, -1 is returned.
789    *
790    * @param ch character to find
791    * @param fromIndex index to start the search
792    * @return location (base 0) of the character, or -1 if not found
793    */
794   public native int indexOf(int ch, int fromIndex);
795
796   /**
797    * Finds the last instance of a character in this String.
798    *
799    * @param ch character to find
800    * @return location (base 0) of the character, or -1 if not found
801    */
802   public int lastIndexOf(int ch)
803   {
804     return lastIndexOf(ch, count - 1);
805   }
806
807   /**
808    * Finds the last instance of a character in this String, starting at
809    * a given index.  If starting index is greater than the maximum valid
810    * index, then the search begins at the end of this String.  If the
811    * starting index is less than zero, -1 is returned.
812    *
813    * @param ch character to find
814    * @param fromIndex index to start the search
815    * @return location (base 0) of the character, or -1 if not found
816    */
817   public native int lastIndexOf(int ch, int fromIndex);
818
819   /**
820    * Finds the first instance of a String in this String.
821    *
822    * @param str String to find
823    * @return location (base 0) of the String, or -1 if not found
824    * @throws NullPointerException if str is null
825    */
826   public int indexOf(String str)
827   {
828     return indexOf(str, 0);
829   }
830
831   /**
832    * Finds the first instance of a String in this String, starting at
833    * a given index.  If starting index is less than 0, the search
834    * starts at the beginning of this String.  If the starting index
835    * is greater than the length of this String, -1 is returned.
836    *
837    * @param str String to find
838    * @param fromIndex index to start the search
839    * @return location (base 0) of the String, or -1 if not found
840    * @throws NullPointerException if str is null
841    */
842   public native int indexOf(String str, int fromIndex);
843
844   /**
845    * Finds the last instance of a String in this String.
846    *
847    * @param str String to find
848    * @return location (base 0) of the String, or -1 if not found
849    * @throws NullPointerException if str is null
850    */
851   public int lastIndexOf(String str)
852   {
853     return lastIndexOf(str, count - str.count);
854   }
855
856   /**
857    * Finds the last instance of a String in this String, starting at
858    * a given index.  If starting index is greater than the maximum valid
859    * index, then the search begins at the end of this String.  If the
860    * starting index is less than zero, -1 is returned.
861    *
862    * @param str String to find
863    * @param fromIndex index to start the search
864    * @return location (base 0) of the String, or -1 if not found
865    * @throws NullPointerException if str is null
866    */
867   public int lastIndexOf(String str, int fromIndex)
868   {
869     if (fromIndex >= count)
870       fromIndex = count - str.count;
871     for (;; --fromIndex)
872       {
873         if (fromIndex < 0)
874           return -1;
875         if (startsWith(str, fromIndex))
876           return fromIndex;
877       }
878   }
879
880   /**
881    * Creates a substring of this String, starting at a specified index
882    * and ending at the end of this String.
883    *
884    * @param begin index to start substring (base 0)
885    * @return new String which is a substring of this String
886    * @throws IndexOutOfBoundsException if begin &lt; 0 || begin &gt; length()
887    *         (while unspecified, this is a StringIndexOutOfBoundsException)
888    */
889   public String substring(int begin)
890   {
891     return substring(begin, count);
892   }
893
894   /**
895    * Creates a substring of this String, starting at a specified index
896    * and ending at one character before a specified index.
897    *
898    * @param begin index to start substring (inclusive, base 0)
899    * @param end index to end at (exclusive)
900    * @return new String which is a substring of this String
901    * @throws IndexOutOfBoundsException if begin &lt; 0 || end &gt; length()
902    *         || begin &gt; end (while unspecified, this is a
903    *         StringIndexOutOfBoundsException)
904    */
905   public native String substring(int begin, int end);
906
907   /**
908    * Creates a substring of this String, starting at a specified index
909    * and ending at one character before a specified index. This behaves like
910    * <code>substring(begin, end)</code>.
911    *
912    * @param begin index to start substring (inclusive, base 0)
913    * @param end index to end at (exclusive)
914    * @return new String which is a substring of this String
915    * @throws IndexOutOfBoundsException if begin &lt; 0 || end &gt; length()
916    *         || begin &gt; end
917    * @since 1.4
918    */
919   public CharSequence subSequence(int begin, int end)
920   {
921     return substring(begin, end);
922   }
923
924   /**
925    * Concatenates a String to this String. This results in a new string unless
926    * one of the two originals is "".
927    *
928    * @param str String to append to this String
929    * @return newly concatenated String
930    * @throws NullPointerException if str is null
931    */
932   public native String concat(String str);
933
934   /**
935    * Replaces every instance of a character in this String with a new
936    * character. If no replacements occur, this is returned.
937    *
938    * @param oldChar the old character to replace
939    * @param newChar the new character
940    * @return new String with all instances of oldChar replaced with newChar
941    */
942   public native String replace(char oldChar, char newChar);
943
944   /**
945    * Test if this String matches a regular expression. This is shorthand for
946    * <code>{@link Pattern}.matches(regex, this)</code>.
947    *
948    * @param regex the pattern to match
949    * @return true if the pattern matches
950    * @throws NullPointerException if regex is null
951    * @throws PatternSyntaxException if regex is invalid
952    * @see Pattern#matches(String, CharSequence)
953    * @since 1.4
954    */
955   public boolean matches(String regex)
956   {
957     return Pattern.matches(regex, this);
958   }
959
960   /**
961    * Replaces the first substring match of the regular expression with a
962    * given replacement. This is shorthand for <code>{@link Pattern}
963    *   .compile(regex).matcher(this).replaceFirst(replacement)</code>.
964    *
965    * @param regex the pattern to match
966    * @param replacement the replacement string
967    * @return the modified string
968    * @throws NullPointerException if regex or replacement is null
969    * @throws PatternSyntaxException if regex is invalid
970    * @see #replaceAll(String, String)
971    * @see Pattern#compile(String)
972    * @see Pattern#matcher(CharSequence)
973    * @see Matcher#replaceFirst(String)
974    * @since 1.4
975    */
976   public String replaceFirst(String regex, String replacement)
977   {
978     return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
979   }
980
981   /**
982    * Replaces all matching substrings of the regular expression with a
983    * given replacement. This is shorthand for <code>{@link Pattern}
984    *   .compile(regex).matcher(this).replaceAll(replacement)</code>.
985    *
986    * @param regex the pattern to match
987    * @param replacement the replacement string
988    * @return the modified string
989    * @throws NullPointerException if regex or replacement is null
990    * @throws PatternSyntaxException if regex is invalid
991    * @see #replaceFirst(String, String)
992    * @see Pattern#compile(String)
993    * @see Pattern#matcher(CharSequence)
994    * @see Matcher#replaceAll(String)
995    * @since 1.4
996    */
997   public String replaceAll(String regex, String replacement)
998   {
999     return Pattern.compile(regex).matcher(this).replaceAll(replacement);
1000   }
1001
1002   /**
1003    * Split this string around the matches of a regular expression. Each
1004    * element of the returned array is the largest block of characters not
1005    * terminated by the regular expression, in the order the matches are found.
1006    *
1007    * <p>The limit affects the length of the array. If it is positive, the
1008    * array will contain at most n elements (n - 1 pattern matches). If
1009    * negative, the array length is unlimited, but there can be trailing empty
1010    * entries. if 0, the array length is unlimited, and trailing empty entries
1011    * are discarded.
1012    *
1013    * <p>For example, splitting "boo:and:foo" yields:<br>
1014    * <table border=0>
1015    * <th><td>Regex</td> <td>Limit</td> <td>Result</td></th>
1016    * <tr><td>":"</td>   <td>2</td>  <td>{ "boo", "and:foo" }</td></tr>
1017    * <tr><td>":"</td>   <td>t</td>  <td>{ "boo", "and", "foo" }</td></tr>
1018    * <tr><td>":"</td>   <td>-2</td> <td>{ "boo", "and", "foo" }</td></tr>
1019    * <tr><td>"o"</td>   <td>5</td>  <td>{ "b", "", ":and:f", "", "" }</td></tr>
1020    * <tr><td>"o"</td>   <td>-2</td> <td>{ "b", "", ":and:f", "", "" }</td></tr>
1021    * <tr><td>"o"</td>   <td>0</td>  <td>{ "b", "", ":and:f" }</td></tr>
1022    * </table>
1023    *
1024    * <p>This is shorthand for
1025    * <code>{@link Pattern}.compile(regex).split(this, limit)</code>.
1026    *
1027    * @param regex the pattern to match
1028    * @param limit the limit threshold
1029    * @return the array of split strings
1030    * @throws NullPointerException if regex or replacement is null
1031    * @throws PatternSyntaxException if regex is invalid
1032    * @see Pattern#compile(String)
1033    * @see Pattern#split(CharSequence, int)
1034    * @since 1.4
1035    */
1036   public String[] split(String regex, int limit)
1037   {
1038     return Pattern.compile(regex).split(this, limit);
1039   }
1040
1041   /**
1042    * Split this string around the matches of a regular expression. Each
1043    * element of the returned array is the largest block of characters not
1044    * terminated by the regular expression, in the order the matches are found.
1045    * The array length is unlimited, and trailing empty entries are discarded,
1046    * as though calling <code>split(regex, 0)</code>.
1047    *
1048    * @param regex the pattern to match
1049    * @return the array of split strings
1050    * @throws NullPointerException if regex or replacement is null
1051    * @throws PatternSyntaxException if regex is invalid
1052    * @see #split(String, int)
1053    * @see Pattern#compile(String)
1054    * @see Pattern#split(CharSequence, int)
1055    * @since 1.4
1056    */
1057   public String[] split(String regex)
1058   {
1059     return Pattern.compile(regex).split(this, 0);
1060   }
1061
1062   /**
1063    * Lowercases this String according to a particular locale. This uses
1064    * Unicode's special case mappings, as applied to the given Locale, so the
1065    * resulting string may be a different length.
1066    *
1067    * @param loc locale to use
1068    * @return new lowercased String, or this if no characters were lowercased
1069    * @throws NullPointerException if loc is null
1070    * @see #toUpperCase(Locale)
1071    * @since 1.1
1072    */
1073   public native String toLowerCase(Locale locale);
1074
1075   /**
1076    * Lowercases this String. This uses Unicode's special case mappings, as
1077    * applied to the platform's default Locale, so the resulting string may
1078    * be a different length.
1079    *
1080    * @return new lowercased String, or this if no characters were lowercased
1081    * @see #toLowerCase(Locale)
1082    * @see #toUpperCase()
1083    */
1084   public String toLowerCase()
1085   {
1086     // The JDK is a bit confused about what to do here.  If we pass in
1087     // the default Locale then special Locale handling might be
1088     // invoked.  However, the docs also say that Character.toLowerCase
1089     // rules here.  We go with the latter.
1090     return toLowerCase (null);
1091   }
1092
1093   /**
1094    * Uppercases this String according to a particular locale. This uses
1095    * Unicode's special case mappings, as applied to the given Locale, so the
1096    * resulting string may be a different length.
1097    *
1098    * @param loc locale to use
1099    * @return new uppercased String, or this if no characters were uppercased
1100    * @throws NullPointerException if loc is null
1101    * @see #toLowerCase(Locale)
1102    * @since 1.1
1103    */
1104   public native String toUpperCase(Locale locale);
1105
1106   /**
1107    * Uppercases this String. This uses Unicode's special case mappings, as
1108    * applied to the platform's default Locale, so the resulting string may
1109    * be a different length.
1110    *
1111    * @return new uppercased String, or this if no characters were uppercased
1112    * @see #toUpperCase(Locale)
1113    * @see #toLowerCase()
1114    */
1115   public String toUpperCase()
1116   {
1117     // The JDK is a bit confused about what to do here.  If we pass in
1118     // the default Locale then special Locale handling might be
1119     // invoked.  However, the docs also say that Character.toLowerCase
1120     // rules here.  We go with the latter.
1121     return toUpperCase (null);
1122   }
1123
1124   /**
1125    * Trims all characters less than or equal to <code>'\u0020'</code>
1126    * (<code>' '</code>) from the beginning and end of this String. This
1127    * includes many, but not all, ASCII control characters, and all
1128    * {@link Character#isWhitespace(char)}.
1129    *
1130    * @return new trimmed String, or this if nothing trimmed
1131    */
1132   public native String trim();
1133
1134   /**
1135    * Returns this, as it is already a String!
1136    *
1137    * @return this
1138    */
1139   public String toString()
1140   {
1141     return this;
1142   }
1143
1144   /**
1145    * Copies the contents of this String into a character array. Subsequent
1146    * changes to the array do not affect the String.
1147    *
1148    * @return character array copying the String
1149    */
1150   public native char[] toCharArray();
1151
1152   /**
1153    * Returns a String representation of an Object. This is "null" if the
1154    * object is null, otherwise it is <code>obj.toString()</code> (which
1155    * can be null).
1156    *
1157    * @param obj the Object
1158    * @return the string conversion of obj
1159    */
1160   public static String valueOf(Object obj)
1161   {
1162     return obj == null ? "null" : obj.toString();
1163   }
1164
1165   /**
1166    * Returns a String representation of a character array. Subsequent
1167    * changes to the array do not affect the String.
1168    *
1169    * @param data the character array
1170    * @return a String containing the same character sequence as data
1171    * @throws NullPointerException if data is null
1172    * @see #valueOf(char[], int, int)
1173    * @see #String(char[])
1174    */
1175   public static String valueOf(char[] data)
1176   {
1177     return valueOf (data, 0, data.length);
1178   }
1179
1180   /**
1181    * Returns a String representing the character sequence of the char array,
1182    * starting at the specified offset, and copying chars up to the specified
1183    * count. Subsequent changes to the array do not affect the String.
1184    *
1185    * @param data character array
1186    * @param offset position (base 0) to start copying out of data
1187    * @param count the number of characters from data to copy
1188    * @return String containing the chars from data[offset..offset+count]
1189    * @throws NullPointerException if data is null
1190    * @throws IndexOutOfBoundsException if (offset &lt; 0 || count &lt; 0
1191    *         || offset + count &gt; data.length)
1192    *         (while unspecified, this is a StringIndexOutOfBoundsException)
1193    * @see #String(char[], int, int)
1194    */
1195   public static native String valueOf(char[] data, int offset, int count);
1196
1197   /**
1198    * Returns a String representing the character sequence of the char array,
1199    * starting at the specified offset, and copying chars up to the specified
1200    * count. Subsequent changes to the array do not affect the String.
1201    *
1202    * @param data character array
1203    * @param offset position (base 0) to start copying out of data
1204    * @param count the number of characters from data to copy
1205    * @return String containing the chars from data[offset..offset+count]
1206    * @throws NullPointerException if data is null
1207    * @throws IndexOutOfBoundsException if (offset &lt; 0 || count &lt; 0
1208    *         || offset + count &lt; 0 (overflow)
1209    *         || offset + count &gt; data.length)
1210    *         (while unspecified, this is a StringIndexOutOfBoundsException)
1211    * @see #String(char[], int, int)
1212    */
1213   public static String copyValueOf(char[] data, int offset, int count)
1214   {
1215     String r = new String ();
1216     r.init(data, offset, count, false);
1217     return r;
1218   }
1219
1220   /**
1221    * Returns a String representation of a character array. Subsequent
1222    * changes to the array do not affect the String.
1223    *
1224    * @param data the character array
1225    * @return a String containing the same character sequence as data
1226    * @throws NullPointerException if data is null
1227    * @see #copyValueOf(char[], int, int)
1228    * @see #String(char[])
1229    */
1230   public static String copyValueOf(char[] data)
1231   {
1232     return copyValueOf (data, 0, data.length);
1233   }
1234
1235   /**
1236    * Returns a String representing a boolean.
1237    *
1238    * @param b the boolean
1239    * @return "true" if b is true, else "false"
1240    */
1241   public static String valueOf(boolean b)
1242   {
1243     return b ? "true" : "false";
1244   }
1245
1246   /**
1247    * Returns a String representing a character.
1248    *
1249    * @param c the character
1250    * @return String containing the single character c
1251    */
1252   public static native String valueOf(char c);
1253
1254   /**
1255    * Returns a String representing an integer.
1256    *
1257    * @param i the integer
1258    * @return String containing the integer in base 10
1259    * @see Integer#toString(int)
1260    */
1261   public static native String valueOf(int i);
1262
1263   /**
1264    * Returns a String representing a long.
1265    *
1266    * @param l the long
1267    * @return String containing the long in base 10
1268    * @see Long#toString(long)
1269    */
1270   public static String valueOf(long l)
1271   {
1272     return Long.toString(l);
1273   }
1274
1275   /**
1276    * Returns a String representing a float.
1277    *
1278    * @param f the float
1279    * @return String containing the float
1280    * @see Float#toString(float)
1281    */
1282   public static String valueOf(float f)
1283   {
1284     return Float.toString(f);
1285   }
1286
1287   /**
1288    * Returns a String representing a double.
1289    *
1290    * @param d the double
1291    * @return String containing the double
1292    * @see Double#toString(double)
1293    */
1294   public static String valueOf(double d)
1295   {
1296     return Double.toString(d);
1297   }
1298
1299
1300   /** @since 1.5 */
1301   public static String format(Locale locale, String format, Object... args)
1302   {
1303     Formatter f = new Formatter(locale);
1304     return f.format(format, args).toString();
1305   }
1306
1307   /** @since 1.5 */
1308   public static String format(String format, Object... args)
1309   {
1310     return format(Locale.getDefault(), format, args);
1311   }
1312
1313   /**
1314    * Fetches this String from the intern hashtable.
1315    * If two Strings are considered equal, by the equals() method, 
1316    * then intern() will return the same String instance. ie. 
1317    * if (s1.equals(s2)) then (s1.intern() == s2.intern()). 
1318    * All string literals and string-valued constant expressions 
1319    * are already interned.
1320    *
1321    * @return the interned String
1322    */
1323   public native String intern();
1324
1325   /**
1326    * Return the number of code points between two indices in the
1327    * <code>String</code>.  An unpaired surrogate counts as a
1328    * code point for this purpose.  Characters outside the indicated
1329    * range are not examined, even if the range ends in the middle of a
1330    * surrogate pair.
1331    *
1332    * @param start the starting index
1333    * @param end one past the ending index
1334    * @return the number of code points
1335    * @since 1.5
1336    */
1337   public synchronized int codePointCount(int start, int end)
1338   {
1339     if (start < 0 || end > count || start > end)
1340       throw new StringIndexOutOfBoundsException();
1341
1342     int count = 0;
1343     while (start < end)
1344       {
1345         char base = charAt(start);
1346         if (base < Character.MIN_HIGH_SURROGATE
1347             || base > Character.MAX_HIGH_SURROGATE
1348             || start == end
1349             || start == count
1350             || charAt(start + 1) < Character.MIN_LOW_SURROGATE
1351             || charAt(start + 1) > Character.MAX_LOW_SURROGATE)
1352           {
1353             // Nothing.
1354           }
1355         else
1356           {
1357             // Surrogate pair.
1358             ++start;
1359           }
1360         ++start;
1361         ++count;
1362       }
1363     return count;
1364   }
1365   
1366   /**
1367    * Returns true iff this String contains the sequence of Characters
1368    * described in s.
1369    * @param s the CharSequence
1370    * @return true iff this String contains s
1371    * 
1372    * @since 1.5
1373    */
1374   public boolean contains (CharSequence s)
1375   {
1376     return this.indexOf(s.toString()) != -1;
1377   }
1378   
1379   /**
1380    * Returns a string that is this string with all instances of the sequence
1381    * represented by <code>target</code> replaced by the sequence in 
1382    * <code>replacement</code>.
1383    * @param target the sequence to be replaced
1384    * @param replacement the sequence used as the replacement
1385    * @return the string constructed as above
1386    */
1387   public String replace (CharSequence target, CharSequence replacement)
1388   {
1389     String targetString = target.toString();
1390     String replaceString = replacement.toString();
1391     int targetLength = target.length();
1392     int replaceLength = replacement.length();
1393     
1394     int startPos = this.indexOf(targetString);
1395     StringBuilder result = new StringBuilder(this);    
1396     while (startPos != -1)
1397       {
1398         // Replace the target with the replacement
1399         result.replace(startPos, startPos + targetLength, replaceString);
1400
1401         // Search for a new occurrence of the target
1402         startPos = result.indexOf(targetString, startPos + replaceLength);
1403       }
1404     return result.toString();
1405   }
1406   
1407   /**
1408    * Return the index into this String that is offset from the given index by 
1409    * <code>codePointOffset</code> code points.
1410    * @param index the index at which to start
1411    * @param codePointOffset the number of code points to offset
1412    * @return the index into this String that is <code>codePointOffset</code>
1413    * code points offset from <code>index</code>.
1414    * 
1415    * @throws IndexOutOfBoundsException if index is negative or larger than the
1416    * length of this string.
1417    * @throws IndexOutOfBoundsException if codePointOffset is positive and the
1418    * substring starting with index has fewer than codePointOffset code points.
1419    * @throws IndexOutOfBoundsException if codePointOffset is negative and the
1420    * substring ending with index has fewer than (-codePointOffset) code points.
1421    * @since 1.5
1422    */
1423   public int offsetByCodePoints(int index, int codePointOffset)
1424   {
1425     if (index < 0 || index > count)
1426       throw new IndexOutOfBoundsException();
1427     
1428     return Character.offsetByCodePoints(this, index, codePointOffset);
1429   }
1430
1431   /**
1432    * Returns true if, and only if, {@link #length()}
1433    * is <code>0</code>.
1434    *
1435    * @return true if the length of the string is zero.
1436    * @since 1.6
1437    */
1438   public boolean isEmpty()
1439   {
1440     return count == 0;
1441   }
1442
1443   // Generate a String that shares the value array: subsequent changes
1444   // to this array will affect the String.  A private internal method
1445   // that is called from CPStringBuilder by compiler-generated code.
1446   private static String toString(char[] value, int startIndex, int count)
1447   {
1448     return new String(value, startIndex, count, true);
1449   }
1450
1451   private native void init(char[] chars, int offset, int count,
1452                            boolean dont_copy);
1453   private native void init(byte[] chars, int hibyte, int offset, int count);
1454   private native void init(byte[] chars, int offset, int count, String enc)
1455     throws UnsupportedEncodingException;
1456   private native void init(gnu.gcj.runtime.StringBuffer buffer);
1457 }