Source for java.lang.String

   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: }