Home | History | Annotate | Download | only in lang
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package java.lang;
     19 
     20 import java.io.Serializable;
     21 import java.io.UnsupportedEncodingException;
     22 import java.nio.ByteBuffer;
     23 import java.nio.CharBuffer;
     24 import java.nio.charset.Charset;
     25 import java.nio.charset.Charsets;
     26 import java.util.Arrays;
     27 import java.util.Comparator;
     28 import java.util.Formatter;
     29 import java.util.Locale;
     30 import java.util.regex.Pattern;
     31 import libcore.util.EmptyArray;
     32 
     33 /**
     34  * An immutable sequence of UTF-16 {@code char}s.
     35  * See {@link Character} for details about the relationship between {@code char} and
     36  * Unicode code points.
     37  *
     38  * <a name="backing_array"><h3>Backing Arrays</h3></a>
     39  * This class is implemented using a {@code char[]}. The length of the array may exceed
     40  * the length of the string. For example, the string "Hello" may be backed by
     41  * the array {@code ['H', 'e', 'l', 'l', 'o', 'W'. 'o', 'r', 'l', 'd']} with
     42  * offset 0 and length 5.
     43  *
     44  * <p>Multiple strings can share the same {@code char[]} because strings are immutable.
     45  * The {@link #substring} method <strong>always</strong> returns a string that
     46  * shares the backing array of its source string. Generally this is an
     47  * optimization: fewer {@code char[]}s need to be allocated, and less copying
     48  * is necessary. But this can also lead to unwanted heap retention. Taking a
     49  * short substring of long string means that the long shared {@code char[]} won't be
     50  * garbage until both strings are garbage. This typically happens when parsing
     51  * small substrings out of a large input. To avoid this where necessary, call
     52  * {@code new String(longString.subString(...))}. The string copy constructor
     53  * always ensures that the backing array is no larger than necessary.
     54  *
     55  * @see StringBuffer
     56  * @see StringBuilder
     57  * @see Charset
     58  * @since 1.0
     59  */
     60 public final class String implements Serializable, Comparable<String>, CharSequence {
     61 
     62     private static final long serialVersionUID = -6849794470754667710L;
     63 
     64     private static final char REPLACEMENT_CHAR = (char) 0xfffd;
     65 
     66     private static final class CaseInsensitiveComparator implements
     67             Comparator<String>, Serializable {
     68         private static final long serialVersionUID = 8575799808933029326L;
     69 
     70         /**
     71          * See {@link java.lang.String#compareToIgnoreCase}.
     72          *
     73          * @exception ClassCastException
     74          *                if objects are not the correct type
     75          */
     76         public int compare(String o1, String o2) {
     77             return o1.compareToIgnoreCase(o2);
     78         }
     79     }
     80 
     81     /**
     82      * Compares strings using {@link #compareToIgnoreCase}.
     83      * This is not suitable for case-insensitive string comparison for all locales.
     84      * Use a {@link java.text.Collator} instead.
     85      */
     86     public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
     87 
     88     private static final char[] ASCII;
     89     static {
     90         ASCII = new char[128];
     91         for (int i = 0; i < ASCII.length; ++i) {
     92             ASCII[i] = (char) i;
     93         }
     94     }
     95 
     96     private final char[] value;
     97 
     98     private final int offset;
     99 
    100     private final int count;
    101 
    102     private int hashCode;
    103 
    104     /**
    105      * Creates an empty string.
    106      */
    107     public String() {
    108         value = EmptyArray.CHAR;
    109         offset = 0;
    110         count = 0;
    111     }
    112 
    113     /**
    114      * Converts the byte array to a string using the system's
    115      * {@link java.nio.charset.Charset#defaultCharset default charset}.
    116      */
    117     @FindBugsSuppressWarnings("DM_DEFAULT_ENCODING")
    118     public String(byte[] data) {
    119         this(data, 0, data.length);
    120     }
    121 
    122     /**
    123      * Converts the byte array to a string, setting the high byte of every
    124      * {@code char} to the specified value.
    125      *
    126      * @param data
    127      *            the byte array to convert to a string.
    128      * @param high
    129      *            the high byte to use.
    130      * @throws NullPointerException
    131      *             if {@code data == null}.
    132      * @deprecated Use {@link #String(byte[])} or {@link #String(byte[], String)} instead.
    133      */
    134     @Deprecated
    135     public String(byte[] data, int high) {
    136         this(data, high, 0, data.length);
    137     }
    138 
    139     /**
    140      * Converts a subsequence of the byte array to a string using the system's
    141      * {@link java.nio.charset.Charset#defaultCharset default charset}.
    142      *
    143      * @throws NullPointerException
    144      *             if {@code data == null}.
    145      * @throws IndexOutOfBoundsException
    146      *             if {@code byteCount < 0 || offset < 0 || offset + byteCount > data.length}.
    147      */
    148     public String(byte[] data, int offset, int byteCount) {
    149         this(data, offset, byteCount, Charset.defaultCharset());
    150     }
    151 
    152     /**
    153      * Converts the byte array to a string, setting the high byte of every
    154      * {@code char} to {@code high}.
    155      *
    156      * @throws NullPointerException
    157      *             if {@code data == null}.
    158      * @throws IndexOutOfBoundsException
    159      *             if {@code byteCount < 0 || offset < 0 || offset + byteCount > data.length}
    160      *
    161      * @deprecated Use {@link #String(byte[], int, int)} instead.
    162      */
    163     @Deprecated
    164     public String(byte[] data, int high, int offset, int byteCount) {
    165         if ((offset | byteCount) < 0 || byteCount > data.length - offset) {
    166             throw failedBoundsCheck(data.length, offset, byteCount);
    167         }
    168         this.offset = 0;
    169         this.value = new char[byteCount];
    170         this.count = byteCount;
    171         high <<= 8;
    172         for (int i = 0; i < count; i++) {
    173             value[i] = (char) (high + (data[offset++] & 0xff));
    174         }
    175     }
    176 
    177     /**
    178      * Converts the byte array to a string using the named charset.
    179      *
    180      * <p>The behavior when the bytes cannot be decoded by the named charset
    181      * is unspecified. Use {@link java.nio.charset.CharsetDecoder} for more control.
    182      *
    183      * @throws NullPointerException
    184      *             if {@code data == null}.
    185      * @throws IndexOutOfBoundsException
    186      *             if {@code byteCount < 0 || offset < 0 || offset + byteCount > data.length}.
    187      * @throws UnsupportedEncodingException
    188      *             if the named charset is not supported.
    189      */
    190     public String(byte[] data, int offset, int byteCount, String charsetName) throws UnsupportedEncodingException {
    191         this(data, offset, byteCount, Charset.forNameUEE(charsetName));
    192     }
    193 
    194     /**
    195      * Converts the byte array to a string using the named charset.
    196      *
    197      * <p>The behavior when the bytes cannot be decoded by the named charset
    198      * is unspecified. Use {@link java.nio.charset.CharsetDecoder} for more control.
    199      *
    200      * @throws NullPointerException
    201      *             if {@code data == null}.
    202      * @throws UnsupportedEncodingException
    203      *             if {@code charsetName} is not supported.
    204      */
    205     public String(byte[] data, String charsetName) throws UnsupportedEncodingException {
    206         this(data, 0, data.length, Charset.forNameUEE(charsetName));
    207     }
    208 
    209     /**
    210      * Converts the byte array to a string using the given charset.
    211      *
    212      * <p>The behavior when the bytes cannot be decoded by the given charset
    213      * is to replace malformed input and unmappable code points with the charset's default
    214      * replacement string. Use {@link java.nio.charset.CharsetDecoder} for more control.
    215      *
    216      * @throws IndexOutOfBoundsException
    217      *             if {@code byteCount < 0 || offset < 0 || offset + byteCount > data.length}
    218      * @throws NullPointerException
    219      *             if {@code data == null}
    220      *
    221      * @since 1.6
    222      */
    223     public String(byte[] data, int offset, int byteCount, Charset charset) {
    224         if ((offset | byteCount) < 0 || byteCount > data.length - offset) {
    225             throw failedBoundsCheck(data.length, offset, byteCount);
    226         }
    227 
    228         // We inline UTF-8, ISO-8859-1, and US-ASCII decoders for speed and because 'count' and
    229         // 'value' are final.
    230         String canonicalCharsetName = charset.name();
    231         if (canonicalCharsetName.equals("UTF-8")) {
    232             byte[] d = data;
    233             char[] v = new char[byteCount];
    234 
    235             int idx = offset;
    236             int last = offset + byteCount;
    237             int s = 0;
    238 outer:
    239             while (idx < last) {
    240                 byte b0 = d[idx++];
    241                 if ((b0 & 0x80) == 0) {
    242                     // 0xxxxxxx
    243                     // Range:  U-00000000 - U-0000007F
    244                     int val = b0 & 0xff;
    245                     v[s++] = (char) val;
    246                 } else if (((b0 & 0xe0) == 0xc0) || ((b0 & 0xf0) == 0xe0) ||
    247                         ((b0 & 0xf8) == 0xf0) || ((b0 & 0xfc) == 0xf8) || ((b0 & 0xfe) == 0xfc)) {
    248                     int utfCount = 1;
    249                     if ((b0 & 0xf0) == 0xe0) utfCount = 2;
    250                     else if ((b0 & 0xf8) == 0xf0) utfCount = 3;
    251                     else if ((b0 & 0xfc) == 0xf8) utfCount = 4;
    252                     else if ((b0 & 0xfe) == 0xfc) utfCount = 5;
    253 
    254                     // 110xxxxx (10xxxxxx)+
    255                     // Range:  U-00000080 - U-000007FF (count == 1)
    256                     // Range:  U-00000800 - U-0000FFFF (count == 2)
    257                     // Range:  U-00010000 - U-001FFFFF (count == 3)
    258                     // Range:  U-00200000 - U-03FFFFFF (count == 4)
    259                     // Range:  U-04000000 - U-7FFFFFFF (count == 5)
    260 
    261                     if (idx + utfCount > last) {
    262                         v[s++] = REPLACEMENT_CHAR;
    263                         continue;
    264                     }
    265 
    266                     // Extract usable bits from b0
    267                     int val = b0 & (0x1f >> (utfCount - 1));
    268                     for (int i = 0; i < utfCount; ++i) {
    269                         byte b = d[idx++];
    270                         if ((b & 0xc0) != 0x80) {
    271                             v[s++] = REPLACEMENT_CHAR;
    272                             idx--; // Put the input char back
    273                             continue outer;
    274                         }
    275                         // Push new bits in from the right side
    276                         val <<= 6;
    277                         val |= b & 0x3f;
    278                     }
    279 
    280                     // Note: Java allows overlong char
    281                     // specifications To disallow, check that val
    282                     // is greater than or equal to the minimum
    283                     // value for each count:
    284                     //
    285                     // count    min value
    286                     // -----   ----------
    287                     //   1           0x80
    288                     //   2          0x800
    289                     //   3        0x10000
    290                     //   4       0x200000
    291                     //   5      0x4000000
    292 
    293                     // Allow surrogate values (0xD800 - 0xDFFF) to
    294                     // be specified using 3-byte UTF values only
    295                     if ((utfCount != 2) && (val >= 0xD800) && (val <= 0xDFFF)) {
    296                         v[s++] = REPLACEMENT_CHAR;
    297                         continue;
    298                     }
    299 
    300                     // Reject chars greater than the Unicode maximum of U+10FFFF.
    301                     if (val > 0x10FFFF) {
    302                         v[s++] = REPLACEMENT_CHAR;
    303                         continue;
    304                     }
    305 
    306                     // Encode chars from U+10000 up as surrogate pairs
    307                     if (val < 0x10000) {
    308                         v[s++] = (char) val;
    309                     } else {
    310                         int x = val & 0xffff;
    311                         int u = (val >> 16) & 0x1f;
    312                         int w = (u - 1) & 0xffff;
    313                         int hi = 0xd800 | (w << 6) | (x >> 10);
    314                         int lo = 0xdc00 | (x & 0x3ff);
    315                         v[s++] = (char) hi;
    316                         v[s++] = (char) lo;
    317                     }
    318                 } else {
    319                     // Illegal values 0x8*, 0x9*, 0xa*, 0xb*, 0xfd-0xff
    320                     v[s++] = REPLACEMENT_CHAR;
    321                 }
    322             }
    323 
    324             if (s == byteCount) {
    325                 // We guessed right, so we can use our temporary array as-is.
    326                 this.offset = 0;
    327                 this.value = v;
    328                 this.count = s;
    329             } else {
    330                 // Our temporary array was too big, so reallocate and copy.
    331                 this.offset = 0;
    332                 this.value = new char[s];
    333                 this.count = s;
    334                 System.arraycopy(v, 0, value, 0, s);
    335             }
    336         } else if (canonicalCharsetName.equals("ISO-8859-1")) {
    337             this.offset = 0;
    338             this.value = new char[byteCount];
    339             this.count = byteCount;
    340             Charsets.isoLatin1BytesToChars(data, offset, byteCount, value);
    341         } else if (canonicalCharsetName.equals("US-ASCII")) {
    342             this.offset = 0;
    343             this.value = new char[byteCount];
    344             this.count = byteCount;
    345             Charsets.asciiBytesToChars(data, offset, byteCount, value);
    346         } else {
    347             CharBuffer cb = charset.decode(ByteBuffer.wrap(data, offset, byteCount));
    348             this.offset = 0;
    349             this.count = cb.length();
    350             if (count > 0) {
    351                 // We could use cb.array() directly, but that would mean we'd have to trust
    352                 // the CharsetDecoder doesn't hang on to the CharBuffer and mutate it later,
    353                 // which would break String's immutability guarantee. It would also tend to
    354                 // mean that we'd be wasting memory because CharsetDecoder doesn't trim the
    355                 // array. So we copy.
    356                 this.value = new char[count];
    357                 System.arraycopy(cb.array(), 0, value, 0, count);
    358             } else {
    359                 this.value = EmptyArray.CHAR;
    360             }
    361         }
    362     }
    363 
    364     /**
    365      * Converts the byte array to a String using the given charset.
    366      *
    367      * @throws NullPointerException if {@code data == null}
    368      * @since 1.6
    369      */
    370     public String(byte[] data, Charset charset) {
    371         this(data, 0, data.length, charset);
    372     }
    373 
    374     /**
    375      * Initializes this string to contain the given {@code char}s.
    376      * Modifying the array after creating the string
    377      * has no effect on the string.
    378      *
    379      * @throws NullPointerException if {@code data == null}
    380      */
    381     public String(char[] data) {
    382         this(data, 0, data.length);
    383     }
    384 
    385     /**
    386      * Initializes this string to contain the given {@code char}s.
    387      * Modifying the array after creating the string
    388      * has no effect on the string.
    389      *
    390      * @throws NullPointerException
    391      *             if {@code data == null}.
    392      * @throws IndexOutOfBoundsException
    393      *             if {@code charCount < 0 || offset < 0 || offset + charCount > data.length}
    394      */
    395     public String(char[] data, int offset, int charCount) {
    396         if ((offset | charCount) < 0 || charCount > data.length - offset) {
    397             throw failedBoundsCheck(data.length, offset, charCount);
    398         }
    399         this.offset = 0;
    400         this.value = new char[charCount];
    401         this.count = charCount;
    402         System.arraycopy(data, offset, value, 0, count);
    403     }
    404 
    405     /*
    406      * Internal version of the String(char[], int, int) constructor.
    407      * Does not range check, null check, or copy the array.
    408      */
    409     String(int offset, int charCount, char[] chars) {
    410         this.value = chars;
    411         this.offset = offset;
    412         this.count = charCount;
    413     }
    414 
    415     /**
    416      * Constructs a copy of the given string.
    417      * The returned string's <a href="#backing_array">backing array</a>
    418      * is no larger than necessary.
    419      */
    420     public String(String toCopy) {
    421         value = (toCopy.value.length == toCopy.count)
    422                 ? toCopy.value
    423                 : Arrays.copyOfRange(toCopy.value, toCopy.offset, toCopy.offset + toCopy.length());
    424         offset = 0;
    425         count = value.length;
    426     }
    427 
    428     /**
    429      * Creates a {@code String} from the contents of the specified
    430      * {@code StringBuffer}.
    431      */
    432     public String(StringBuffer stringBuffer) {
    433         offset = 0;
    434         synchronized (stringBuffer) {
    435             value = stringBuffer.shareValue();
    436             count = stringBuffer.length();
    437         }
    438     }
    439 
    440     /**
    441      * Creates a {@code String} from the sub-array of Unicode code points.
    442      *
    443      * @throws NullPointerException
    444      *             if {@code codePoints == null}.
    445      * @throws IllegalArgumentException
    446      *             if any of the elements of {@code codePoints} are not valid
    447      *             Unicode code points.
    448      * @throws IndexOutOfBoundsException
    449      *             if {@code offset} or {@code count} are not within the bounds
    450      *             of {@code codePoints}.
    451      * @since 1.5
    452      */
    453     public String(int[] codePoints, int offset, int count) {
    454         if (codePoints == null) {
    455             throw new NullPointerException("codePoints == null");
    456         }
    457         if ((offset | count) < 0 || count > codePoints.length - offset) {
    458             throw failedBoundsCheck(codePoints.length, offset, count);
    459         }
    460         this.offset = 0;
    461         this.value = new char[count * 2];
    462         int end = offset + count;
    463         int c = 0;
    464         for (int i = offset; i < end; i++) {
    465             c += Character.toChars(codePoints[i], this.value, c);
    466         }
    467         this.count = c;
    468     }
    469 
    470     /**
    471      * Creates a {@code String} from the contents of the specified {@code
    472      * StringBuilder}.
    473      *
    474      * @throws NullPointerException
    475      *             if {@code stringBuilder == null}.
    476      * @since 1.5
    477      */
    478     public String(StringBuilder stringBuilder) {
    479         if (stringBuilder == null) {
    480             throw new NullPointerException("stringBuilder == null");
    481         }
    482         this.offset = 0;
    483         this.count = stringBuilder.length();
    484         this.value = new char[this.count];
    485         stringBuilder.getChars(0, this.count, this.value, 0);
    486     }
    487 
    488     /**
    489      * Returns the {@code char} at {@code index}.
    490      * @throws IndexOutOfBoundsException if {@code index < 0} or {@code index >= length()}.
    491      */
    492     public char charAt(int index) {
    493         if (index < 0 || index >= count) {
    494             throw indexAndLength(index);
    495         }
    496         return value[offset + index];
    497     }
    498 
    499     private StringIndexOutOfBoundsException indexAndLength(int index) {
    500         throw new StringIndexOutOfBoundsException(this, index);
    501     }
    502 
    503     private StringIndexOutOfBoundsException startEndAndLength(int start, int end) {
    504         throw new StringIndexOutOfBoundsException(this, start, end - start);
    505     }
    506 
    507     private StringIndexOutOfBoundsException failedBoundsCheck(int arrayLength, int offset, int count) {
    508         throw new StringIndexOutOfBoundsException(arrayLength, offset, count);
    509     }
    510 
    511     /**
    512      * This isn't equivalent to either of ICU's u_foldCase case folds, and thus any of the Unicode
    513      * case folds, but it's what the RI uses.
    514      */
    515     private char foldCase(char ch) {
    516         if (ch < 128) {
    517             if ('A' <= ch && ch <= 'Z') {
    518                 return (char) (ch + ('a' - 'A'));
    519             }
    520             return ch;
    521         }
    522         return Character.toLowerCase(Character.toUpperCase(ch));
    523     }
    524 
    525     /**
    526      * Compares this string to the given string.
    527      *
    528      * <p>The strings are compared one {@code char} at a time.
    529      * In the discussion of the return value below, note that {@code char} does not
    530      * mean code point, though this should only be visible for surrogate pairs.
    531      *
    532      * <p>If there is an index at which the two strings differ, the result is
    533      * the difference between the two {@code char}s at the lowest such index.
    534      * If not, but the lengths of the strings differ, the result is the difference
    535      * between the two strings' lengths.
    536      * If the strings are the same length and every {@code char} is the same, the result is 0.
    537      *
    538      * @throws NullPointerException
    539      *             if {@code string} is {@code null}.
    540      */
    541     public native int compareTo(String string);
    542 
    543     /**
    544      * Compares this string to the given string, ignoring case differences.
    545      *
    546      * <p>The strings are compared one {@code char} at a time. This is not suitable
    547      * for case-insensitive string comparison for all locales.
    548      * Use a {@link java.text.Collator} instead.
    549      *
    550      * <p>If there is an index at which the two strings differ, the result is
    551      * the difference between the two {@code char}s at the lowest such index.
    552      * If not, but the lengths of the strings differ, the result is the difference
    553      * between the two strings' lengths.
    554      * If the strings are the same length and every {@code char} is the same, the result is 0.
    555      *
    556      * @throws NullPointerException
    557      *             if {@code string} is {@code null}.
    558      */
    559     public int compareToIgnoreCase(String string) {
    560         int o1 = offset, o2 = string.offset, result;
    561         int end = offset + (count < string.count ? count : string.count);
    562         char c1, c2;
    563         char[] target = string.value;
    564         while (o1 < end) {
    565             if ((c1 = value[o1++]) == (c2 = target[o2++])) {
    566                 continue;
    567             }
    568             c1 = foldCase(c1);
    569             c2 = foldCase(c2);
    570             if ((result = c1 - c2) != 0) {
    571                 return result;
    572             }
    573         }
    574         return count - string.count;
    575     }
    576 
    577     /**
    578      * Concatenates this string and the specified string.
    579      *
    580      * @param string
    581      *            the string to concatenate
    582      * @return a new string which is the concatenation of this string and the
    583      *         specified string.
    584      */
    585     public String concat(String string) {
    586         if (string.count > 0 && count > 0) {
    587             char[] buffer = new char[count + string.count];
    588             System.arraycopy(value, offset, buffer, 0, count);
    589             System.arraycopy(string.value, string.offset, buffer, count, string.count);
    590             return new String(0, buffer.length, buffer);
    591         }
    592         return count == 0 ? string : this;
    593     }
    594 
    595     /**
    596      * Creates a new string by copying the given {@code char[]}.
    597      * Modifying the array after creating the string has no
    598      * effect on the string.
    599      *
    600      * @throws NullPointerException
    601      *             if {@code data} is {@code null}.
    602      */
    603     public static String copyValueOf(char[] data) {
    604         return new String(data, 0, data.length);
    605     }
    606 
    607     /**
    608      * Creates a new string by copying the given subsequence of the given {@code char[]}.
    609      * Modifying the array after creating the string has no
    610      * effect on the string.
    611 
    612      * @throws NullPointerException
    613      *             if {@code data} is {@code null}.
    614      * @throws IndexOutOfBoundsException
    615      *             if {@code length < 0, start < 0} or {@code start + length >
    616      *             data.length}.
    617      */
    618     public static String copyValueOf(char[] data, int start, int length) {
    619         return new String(data, start, length);
    620     }
    621 
    622     /**
    623      * Compares the specified string to this string to determine if the
    624      * specified string is a suffix.
    625      *
    626      * @throws NullPointerException
    627      *             if {@code suffix} is {@code null}.
    628      */
    629     public boolean endsWith(String suffix) {
    630         return regionMatches(count - suffix.count, suffix, 0, suffix.count);
    631     }
    632 
    633     /**
    634      * Compares the given object to this string and returns true if they are
    635      * equal. The object must be an instance of {@code String} with the same length,
    636      * where for every index, {@code charAt} on each string returns the same value.
    637      */
    638     @Override public boolean equals(Object other) {
    639         if (other == this) {
    640           return true;
    641         }
    642         if (other instanceof String) {
    643             String s = (String)other;
    644             int count = this.count;
    645             if (s.count != count) {
    646                 return false;
    647             }
    648             // TODO: we want to avoid many boundchecks in the loop below
    649             // for long Strings until we have array equality intrinsic.
    650             // Bad benchmarks just push .equals without first getting a
    651             // hashCode hit (unlike real world use in a Hashtable). Filter
    652             // out these long strings here. When we get the array equality
    653             // intrinsic then remove this use of hashCode.
    654             if (hashCode() != s.hashCode()) {
    655                 return false;
    656             }
    657             char[] value1 = value;
    658             int offset1 = offset;
    659             char[] value2 = s.value;
    660             int offset2 = s.offset;
    661             for (int end = offset1 + count; offset1 < end; ) {
    662                 if (value1[offset1] != value2[offset2]) {
    663                     return false;
    664                 }
    665                 offset1++;
    666                 offset2++;
    667             }
    668             return true;
    669         } else {
    670             return false;
    671         }
    672     }
    673 
    674     /**
    675      * Compares the given string to this string ignoring case.
    676      *
    677      * <p>The strings are compared one {@code char} at a time. This is not suitable
    678      * for case-insensitive string comparison for all locales.
    679      * Use a {@link java.text.Collator} instead.
    680      */
    681     @FindBugsSuppressWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ")
    682     public boolean equalsIgnoreCase(String string) {
    683         if (string == this) {
    684             return true;
    685         }
    686         if (string == null || count != string.count) {
    687             return false;
    688         }
    689         int o1 = offset, o2 = string.offset;
    690         int end = offset + count;
    691         char[] target = string.value;
    692         while (o1 < end) {
    693             char c1 = value[o1++];
    694             char c2 = target[o2++];
    695             if (c1 != c2 && foldCase(c1) != foldCase(c2)) {
    696                 return false;
    697             }
    698         }
    699         return true;
    700     }
    701 
    702     /**
    703      * Mangles a subsequence of this string into a byte array by stripping the high order bits from
    704      * each {@code char}. Use {@link #getBytes()} or {@link #getBytes(String)} instead.
    705      *
    706      * @param start
    707      *            the start offset in this string.
    708      * @param end
    709      *            the end+1 offset in this string.
    710      * @param data
    711      *            the destination byte array.
    712      * @param index
    713      *            the start offset in the destination byte array.
    714      * @throws NullPointerException
    715      *             if {@code data} is {@code null}.
    716      * @throws IndexOutOfBoundsException
    717      *             if {@code start < 0}, {@code end > length()}, {@code index <
    718      *             0} or {@code end - start > data.length - index}.
    719      * @deprecated Use {@link #getBytes()} or {@link #getBytes(String)}
    720      */
    721     @Deprecated
    722     public void getBytes(int start, int end, byte[] data, int index) {
    723         if (start >= 0 && start <= end && end <= count) {
    724             end += offset;
    725             try {
    726                 for (int i = offset + start; i < end; i++) {
    727                     data[index++] = (byte) value[i];
    728                 }
    729             } catch (ArrayIndexOutOfBoundsException ignored) {
    730                 throw failedBoundsCheck(data.length, index, end - start);
    731             }
    732         } else {
    733             throw startEndAndLength(start, end);
    734         }
    735     }
    736 
    737     /**
    738      * Returns a new byte array containing the code points in this string encoded using the
    739      * system's {@link java.nio.charset.Charset#defaultCharset default charset}.
    740      *
    741      * <p>The behavior when this string cannot be represented in the system's default charset
    742      * is unspecified. In practice, when the default charset is UTF-8 (as it is on Android),
    743      * all strings can be encoded.
    744      */
    745     public byte[] getBytes() {
    746         return getBytes(Charset.defaultCharset());
    747     }
    748 
    749     /**
    750      * Returns a new byte array containing the code points of this string encoded using the
    751      * named charset.
    752      *
    753      * <p>The behavior when this string cannot be represented in the named charset
    754      * is unspecified. Use {@link java.nio.charset.CharsetEncoder} for more control.
    755      *
    756      * @throws UnsupportedEncodingException if the charset is not supported
    757      */
    758     public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
    759         return getBytes(Charset.forNameUEE(charsetName));
    760     }
    761 
    762     /**
    763      * Returns a new byte array containing the code points of this string encoded using the
    764      * given charset.
    765      *
    766      * <p>The behavior when this string cannot be represented in the given charset
    767      * is to replace malformed input and unmappable code points with the charset's default
    768      * replacement byte array. Use {@link java.nio.charset.CharsetEncoder} for more control.
    769      *
    770      * @since 1.6
    771      */
    772     public byte[] getBytes(Charset charset) {
    773         String canonicalCharsetName = charset.name();
    774         if (canonicalCharsetName.equals("UTF-8")) {
    775             return Charsets.toUtf8Bytes(value, offset, count);
    776         } else if (canonicalCharsetName.equals("ISO-8859-1")) {
    777             return Charsets.toIsoLatin1Bytes(value, offset, count);
    778         } else if (canonicalCharsetName.equals("US-ASCII")) {
    779             return Charsets.toAsciiBytes(value, offset, count);
    780         } else if (canonicalCharsetName.equals("UTF-16BE")) {
    781             return Charsets.toBigEndianUtf16Bytes(value, offset, count);
    782         } else {
    783             CharBuffer chars = CharBuffer.wrap(this.value, this.offset, this.count);
    784             ByteBuffer buffer = charset.encode(chars.asReadOnlyBuffer());
    785             byte[] bytes = new byte[buffer.limit()];
    786             buffer.get(bytes);
    787             return bytes;
    788         }
    789     }
    790 
    791     /**
    792      * Copies the given subsequence of this string to the given array
    793      * starting at the given offset.
    794      *
    795      * @param start
    796      *            the start offset in this string.
    797      * @param end
    798      *            the end+1 offset in this string.
    799      * @param buffer
    800      *            the destination array.
    801      * @param index
    802      *            the start offset in the destination array.
    803      * @throws NullPointerException
    804      *             if {@code buffer} is {@code null}.
    805      * @throws IndexOutOfBoundsException
    806      *             if {@code start < 0}, {@code end > length()}, {@code start >
    807      *             end}, {@code index < 0}, {@code end - start > buffer.length -
    808      *             index}
    809      */
    810     public void getChars(int start, int end, char[] buffer, int index) {
    811         if (start >= 0 && start <= end && end <= count) {
    812             System.arraycopy(value, start + offset, buffer, index, end - start);
    813         } else {
    814             // We throw StringIndexOutOfBoundsException rather than System.arraycopy's AIOOBE.
    815             throw startEndAndLength(start, end);
    816         }
    817     }
    818 
    819     /**
    820      * getChars without bounds checks, for use by other classes
    821      * within the java.lang package only.  The caller is responsible for
    822      * ensuring that start >= 0 && start <= end && end <= count.
    823      */
    824     void _getChars(int start, int end, char[] buffer, int index) {
    825         System.arraycopy(value, start + offset, buffer, index, end - start);
    826     }
    827 
    828     @Override public int hashCode() {
    829         int hash = hashCode;
    830         if (hash == 0) {
    831             if (count == 0) {
    832                 return 0;
    833             }
    834             final int end = count + offset;
    835             final char[] chars = value;
    836             for (int i = offset; i < end; ++i) {
    837                 hash = 31*hash + chars[i];
    838             }
    839             hashCode = hash;
    840         }
    841         return hash;
    842     }
    843 
    844     /**
    845      * Returns the first index of the given code point, or -1.
    846      * The search starts at the beginning and moves towards
    847      * the end of this string.
    848      */
    849     public int indexOf(int c) {
    850         // TODO: just "return indexOf(c, 0);" when the JIT can inline that deep.
    851         if (c > 0xffff) {
    852             return indexOfSupplementary(c, 0);
    853         }
    854         return fastIndexOf(c, 0);
    855     }
    856 
    857     /**
    858      * Returns the next index of the given code point, or -1. The
    859      * search starts at the given offset and moves towards
    860      * the end of this string.
    861      */
    862     public int indexOf(int c, int start) {
    863         if (c > 0xffff) {
    864             return indexOfSupplementary(c, start);
    865         }
    866         return fastIndexOf(c, start);
    867     }
    868 
    869     private native int fastIndexOf(int c, int start);
    870 
    871     private int indexOfSupplementary(int c, int start) {
    872         if (!Character.isSupplementaryCodePoint(c)) {
    873             return -1;
    874         }
    875         char[] chars = Character.toChars(c);
    876         String needle = new String(0, chars.length, chars);
    877         return indexOf(needle, start);
    878     }
    879 
    880     /**
    881      * Returns the first index of the given string, or -1. The
    882      * search starts at the beginning and moves towards the end
    883      * of this string.
    884      *
    885      * @throws NullPointerException
    886      *             if {@code string} is {@code null}.
    887      */
    888     public int indexOf(String string) {
    889         int start = 0;
    890         int subCount = string.count;
    891         int _count = count;
    892         if (subCount > 0) {
    893             if (subCount > _count) {
    894                 return -1;
    895             }
    896             char[] target = string.value;
    897             int subOffset = string.offset;
    898             char firstChar = target[subOffset];
    899             int end = subOffset + subCount;
    900             while (true) {
    901                 int i = indexOf(firstChar, start);
    902                 if (i == -1 || subCount + i > _count) {
    903                     return -1; // handles subCount > count || start >= count
    904                 }
    905                 int o1 = offset + i, o2 = subOffset;
    906                 char[] _value = value;
    907                 while (++o2 < end && _value[++o1] == target[o2]) {
    908                     // Intentionally empty
    909                 }
    910                 if (o2 == end) {
    911                     return i;
    912                 }
    913                 start = i + 1;
    914             }
    915         }
    916         return start < _count ? start : _count;
    917     }
    918 
    919     /**
    920      * Returns the next index of the given string in this string, or -1. The search
    921      * for the string starts at the given offset and moves towards the end
    922      * of this string.
    923      *
    924      * @throws NullPointerException
    925      *             if {@code subString} is {@code null}.
    926      */
    927     public int indexOf(String subString, int start) {
    928         if (start < 0) {
    929             start = 0;
    930         }
    931         int subCount = subString.count;
    932         int _count = count;
    933         if (subCount > 0) {
    934             if (subCount + start > _count) {
    935                 return -1;
    936             }
    937             char[] target = subString.value;
    938             int subOffset = subString.offset;
    939             char firstChar = target[subOffset];
    940             int end = subOffset + subCount;
    941             while (true) {
    942                 int i = indexOf(firstChar, start);
    943                 if (i == -1 || subCount + i > _count) {
    944                     return -1; // handles subCount > count || start >= count
    945                 }
    946                 int o1 = offset + i, o2 = subOffset;
    947                 char[] _value = value;
    948                 while (++o2 < end && _value[++o1] == target[o2]) {
    949                     // Intentionally empty
    950                 }
    951                 if (o2 == end) {
    952                     return i;
    953                 }
    954                 start = i + 1;
    955             }
    956         }
    957         return start < _count ? start : _count;
    958     }
    959 
    960     /**
    961      * Returns an interned string equal to this string. The VM maintains an internal set of
    962      * unique strings. All string literals found in loaded classes'
    963      * constant pools are automatically interned. Manually-interned strings are only weakly
    964      * referenced, so calling {@code intern} won't lead to unwanted retention.
    965      *
    966      * <p>Interning is typically used because it guarantees that for interned strings
    967      * {@code a} and {@code b}, {@code a.equals(b)} can be simplified to
    968      * {@code a == b}. (This is not true of non-interned strings.)
    969      *
    970      * <p>Many applications find it simpler and more convenient to use an explicit
    971      * {@link java.util.HashMap} to implement their own pools.
    972      */
    973     public native String intern();
    974 
    975     /**
    976      * Returns true if the length of this string is 0.
    977      *
    978      * @since 1.6
    979      */
    980     public boolean isEmpty() {
    981         return count == 0;
    982     }
    983 
    984     /**
    985      * Returns the last index of the code point {@code c}, or -1.
    986      * The search starts at the end and moves towards the
    987      * beginning of this string.
    988      */
    989     public int lastIndexOf(int c) {
    990         if (c > 0xffff) {
    991             return lastIndexOfSupplementary(c, Integer.MAX_VALUE);
    992         }
    993         int _count = count;
    994         int _offset = offset;
    995         char[] _value = value;
    996         for (int i = _offset + _count - 1; i >= _offset; --i) {
    997             if (_value[i] == c) {
    998                 return i - _offset;
    999             }
   1000         }
   1001         return -1;
   1002     }
   1003 
   1004     /**
   1005      * Returns the last index of the code point {@code c}, or -1.
   1006      * The search starts at offset {@code start} and moves towards
   1007      * the beginning of this string.
   1008      */
   1009     public int lastIndexOf(int c, int start) {
   1010         if (c > 0xffff) {
   1011             return lastIndexOfSupplementary(c, start);
   1012         }
   1013         int _count = count;
   1014         int _offset = offset;
   1015         char[] _value = value;
   1016         if (start >= 0) {
   1017             if (start >= _count) {
   1018                 start = _count - 1;
   1019             }
   1020             for (int i = _offset + start; i >= _offset; --i) {
   1021                 if (_value[i] == c) {
   1022                     return i - _offset;
   1023                 }
   1024             }
   1025         }
   1026         return -1;
   1027     }
   1028 
   1029     private int lastIndexOfSupplementary(int c, int start) {
   1030         if (!Character.isSupplementaryCodePoint(c)) {
   1031             return -1;
   1032         }
   1033         char[] chars = Character.toChars(c);
   1034         String needle = new String(0, chars.length, chars);
   1035         return lastIndexOf(needle, start);
   1036     }
   1037 
   1038     /**
   1039      * Returns the index of the start of the last match for the given string in this string, or -1.
   1040      * The search for the string starts at the end and moves towards the beginning
   1041      * of this string.
   1042      *
   1043      * @throws NullPointerException
   1044      *             if {@code string} is {@code null}.
   1045      */
   1046     public int lastIndexOf(String string) {
   1047         // Use count instead of count - 1 so lastIndexOf("") returns count
   1048         return lastIndexOf(string, count);
   1049     }
   1050 
   1051     /**
   1052      * Returns the index of the start of the previous match for the given string in this string,
   1053      * or -1.
   1054      * The search for the string starts at the given index and moves towards the beginning
   1055      * of this string.
   1056      *
   1057      * @throws NullPointerException
   1058      *             if {@code subString} is {@code null}.
   1059      */
   1060     public int lastIndexOf(String subString, int start) {
   1061         int subCount = subString.count;
   1062         if (subCount <= count && start >= 0) {
   1063             if (subCount > 0) {
   1064                 if (start > count - subCount) {
   1065                     start = count - subCount;
   1066                 }
   1067                 // count and subCount are both >= 1
   1068                 char[] target = subString.value;
   1069                 int subOffset = subString.offset;
   1070                 char firstChar = target[subOffset];
   1071                 int end = subOffset + subCount;
   1072                 while (true) {
   1073                     int i = lastIndexOf(firstChar, start);
   1074                     if (i == -1) {
   1075                         return -1;
   1076                     }
   1077                     int o1 = offset + i, o2 = subOffset;
   1078                     while (++o2 < end && value[++o1] == target[o2]) {
   1079                         // Intentionally empty
   1080                     }
   1081                     if (o2 == end) {
   1082                         return i;
   1083                     }
   1084                     start = i - 1;
   1085                 }
   1086             }
   1087             return start < count ? start : count;
   1088         }
   1089         return -1;
   1090     }
   1091 
   1092     /**
   1093      * Returns the number of {@code char}s in this string. If this string contains surrogate pairs,
   1094      * this is not the same as the number of code points.
   1095      */
   1096     public int length() {
   1097         return count;
   1098     }
   1099 
   1100     /**
   1101      * Returns true if the given subsequence of the given string matches this string starting
   1102      * at the given offset.
   1103      *
   1104      * @param thisStart the start offset in this string.
   1105      * @param string the other string.
   1106      * @param start the start offset in {@code string}.
   1107      * @param length the number of {@code char}s to compare.
   1108      * @throws NullPointerException
   1109      *             if {@code string} is {@code null}.
   1110      */
   1111     public boolean regionMatches(int thisStart, String string, int start, int length) {
   1112         if (string == null) {
   1113             throw new NullPointerException("string == null");
   1114         }
   1115         if (start < 0 || string.count - start < length) {
   1116             return false;
   1117         }
   1118         if (thisStart < 0 || count - thisStart < length) {
   1119             return false;
   1120         }
   1121         if (length <= 0) {
   1122             return true;
   1123         }
   1124         int o1 = offset + thisStart, o2 = string.offset + start;
   1125         char[] value1 = value;
   1126         char[] value2 = string.value;
   1127         for (int i = 0; i < length; ++i) {
   1128             if (value1[o1 + i] != value2[o2 + i]) {
   1129                 return false;
   1130             }
   1131         }
   1132         return true;
   1133     }
   1134 
   1135     /**
   1136      * Returns true if the given subsequence of the given string matches this string starting
   1137      * at the given offset.
   1138      *
   1139      * <p>If ignoreCase is true, case is ignored during the comparison.
   1140      * The strings are compared one {@code char} at a time. This is not suitable
   1141      * for case-insensitive string comparison for all locales.
   1142      * Use a {@link java.text.Collator} instead.
   1143      *
   1144      * @param ignoreCase
   1145      *     specifies if case should be ignored (use {@link java.text.Collator} instead for
   1146      *     non-ASCII case insensitivity).
   1147      * @param thisStart the start offset in this string.
   1148      * @param string the other string.
   1149      * @param start the start offset in {@code string}.
   1150      * @param length the number of {@code char}s to compare.
   1151      * @throws NullPointerException
   1152      *             if {@code string} is {@code null}.
   1153      */
   1154     public boolean regionMatches(boolean ignoreCase, int thisStart, String string, int start, int length) {
   1155         if (!ignoreCase) {
   1156             return regionMatches(thisStart, string, start, length);
   1157         }
   1158         if (string == null) {
   1159             throw new NullPointerException("string == null");
   1160         }
   1161         if (thisStart < 0 || length > count - thisStart) {
   1162             return false;
   1163         }
   1164         if (start < 0 || length > string.count - start) {
   1165             return false;
   1166         }
   1167         thisStart += offset;
   1168         start += string.offset;
   1169         int end = thisStart + length;
   1170         char[] target = string.value;
   1171         while (thisStart < end) {
   1172             char c1 = value[thisStart++];
   1173             char c2 = target[start++];
   1174             if (c1 != c2 && foldCase(c1) != foldCase(c2)) {
   1175                 return false;
   1176             }
   1177         }
   1178         return true;
   1179     }
   1180 
   1181     /**
   1182      * Returns a copy of this string after replacing occurrences of the given {@code char} with another.
   1183      */
   1184     public String replace(char oldChar, char newChar) {
   1185         char[] buffer = value;
   1186         int _offset = offset;
   1187         int _count = count;
   1188 
   1189         int idx = _offset;
   1190         int last = _offset + _count;
   1191         boolean copied = false;
   1192         while (idx < last) {
   1193             if (buffer[idx] == oldChar) {
   1194                 if (!copied) {
   1195                     char[] newBuffer = new char[_count];
   1196                     System.arraycopy(buffer, _offset, newBuffer, 0, _count);
   1197                     buffer = newBuffer;
   1198                     idx -= _offset;
   1199                     last -= _offset;
   1200                     copied = true;
   1201                 }
   1202                 buffer[idx] = newChar;
   1203             }
   1204             idx++;
   1205         }
   1206 
   1207         return copied ? new String(0, count, buffer) : this;
   1208     }
   1209 
   1210     /**
   1211      * Returns a copy of this string after replacing occurrences of {@code target} replaced
   1212      * with {@code replacement}. The string is processed from the beginning to the
   1213      * end.
   1214      *
   1215      * @throws NullPointerException
   1216      *             if {@code target} or {@code replacement} is {@code null}.
   1217      */
   1218     public String replace(CharSequence target, CharSequence replacement) {
   1219         if (target == null) {
   1220             throw new NullPointerException("target == null");
   1221         }
   1222         if (replacement == null) {
   1223             throw new NullPointerException("replacement == null");
   1224         }
   1225 
   1226         String targetString = target.toString();
   1227         int matchStart = indexOf(targetString, 0);
   1228         if (matchStart == -1) {
   1229             // If there's nothing to replace, return the original string untouched.
   1230             return this;
   1231         }
   1232 
   1233         String replacementString = replacement.toString();
   1234 
   1235         // The empty target matches at the start and end and between each char.
   1236         int targetLength = targetString.length();
   1237         if (targetLength == 0) {
   1238             // The result contains the original 'count' chars, a copy of the
   1239             // replacement string before every one of those chars, and a final
   1240             // copy of the replacement string at the end.
   1241             int resultLength = count + (count + 1) * replacementString.length();
   1242             StringBuilder result = new StringBuilder(resultLength);
   1243             result.append(replacementString);
   1244             int end = offset + count;
   1245             for (int i = offset; i != end; ++i) {
   1246                 result.append(value[i]);
   1247                 result.append(replacementString);
   1248             }
   1249             return result.toString();
   1250         }
   1251 
   1252         StringBuilder result = new StringBuilder(count);
   1253         int searchStart = 0;
   1254         do {
   1255             // Copy chars before the match...
   1256             result.append(value, offset + searchStart, matchStart - searchStart);
   1257             // Insert the replacement...
   1258             result.append(replacementString);
   1259             // And skip over the match...
   1260             searchStart = matchStart + targetLength;
   1261         } while ((matchStart = indexOf(targetString, searchStart)) != -1);
   1262         // Copy any trailing chars...
   1263         result.append(value, offset + searchStart, count - searchStart);
   1264         return result.toString();
   1265     }
   1266 
   1267     /**
   1268      * Compares the specified string to this string to determine if the
   1269      * specified string is a prefix.
   1270      *
   1271      * @param prefix
   1272      *            the string to look for.
   1273      * @return {@code true} if the specified string is a prefix of this string,
   1274      *         {@code false} otherwise
   1275      * @throws NullPointerException
   1276      *             if {@code prefix} is {@code null}.
   1277      */
   1278     public boolean startsWith(String prefix) {
   1279         return startsWith(prefix, 0);
   1280     }
   1281 
   1282     /**
   1283      * Compares the specified string to this string, starting at the specified
   1284      * offset, to determine if the specified string is a prefix.
   1285      *
   1286      * @param prefix
   1287      *            the string to look for.
   1288      * @param start
   1289      *            the starting offset.
   1290      * @return {@code true} if the specified string occurs in this string at the
   1291      *         specified offset, {@code false} otherwise.
   1292      * @throws NullPointerException
   1293      *             if {@code prefix} is {@code null}.
   1294      */
   1295     public boolean startsWith(String prefix, int start) {
   1296         return regionMatches(start, prefix, 0, prefix.count);
   1297     }
   1298 
   1299     /**
   1300      * Returns a string containing a suffix of this string starting at {@code start}.
   1301      * The returned string shares this string's <a href="#backing_array">backing array</a>.
   1302      *
   1303      * @throws IndexOutOfBoundsException
   1304      *             if {@code start < 0} or {@code start > length()}.
   1305      */
   1306     public String substring(int start) {
   1307         if (start == 0) {
   1308             return this;
   1309         }
   1310         if (start >= 0 && start <= count) {
   1311             return new String(offset + start, count - start, value);
   1312         }
   1313         throw indexAndLength(start);
   1314     }
   1315 
   1316     /**
   1317      * Returns a string containing the given subsequence of this string.
   1318      * The returned string shares this string's <a href="#backing_array">backing array</a>.
   1319      *
   1320      * @param start the start offset.
   1321      * @param end the end+1 offset.
   1322      * @throws IndexOutOfBoundsException
   1323      *             if {@code start < 0}, {@code start > end} or {@code end > length()}.
   1324      */
   1325     public String substring(int start, int end) {
   1326         if (start == 0 && end == count) {
   1327             return this;
   1328         }
   1329         // Fast range check.
   1330         if (start >= 0 && start <= end && end <= count) {
   1331             return new String(offset + start, end - start, value);
   1332         }
   1333         throw startEndAndLength(start, end);
   1334     }
   1335 
   1336     /**
   1337      * Returns a new {@code char} array containing a copy of the {@code char}s in this string.
   1338      * This is expensive and rarely useful. If you just want to iterate over the {@code char}s in
   1339      * the string, use {@link #charAt} instead.
   1340      */
   1341     public char[] toCharArray() {
   1342         char[] buffer = new char[count];
   1343         System.arraycopy(value, offset, buffer, 0, count);
   1344         return buffer;
   1345     }
   1346 
   1347     /**
   1348      * Converts this string to lower case, using the rules of the user's default locale.
   1349      * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
   1350      *
   1351      * @return a new lower case string, or {@code this} if it's already all lower case.
   1352      */
   1353     public String toLowerCase() {
   1354         return CaseMapper.toLowerCase(Locale.getDefault(), this, value, offset, count);
   1355     }
   1356 
   1357     /**
   1358      * Converts this string to lower case, using the rules of {@code locale}.
   1359      *
   1360      * <p>Most case mappings are unaffected by the language of a {@code Locale}. Exceptions include
   1361      * dotted and dotless I in Azeri and Turkish locales, and dotted and dotless I and J in
   1362      * Lithuanian locales. On the other hand, it isn't necessary to provide a Greek locale to get
   1363      * correct case mapping of Greek characters: any locale will do.
   1364      *
   1365      * <p>See <a href="http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt">http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt</a>
   1366      * for full details of context- and language-specific special cases.
   1367      *
   1368      * @return a new lower case string, or {@code this} if it's already all lower case.
   1369      */
   1370     public String toLowerCase(Locale locale) {
   1371         return CaseMapper.toLowerCase(locale, this, value, offset, count);
   1372     }
   1373 
   1374     /**
   1375      * Returns this string.
   1376      */
   1377     @Override
   1378     public String toString() {
   1379         return this;
   1380     }
   1381 
   1382     /**
   1383      * Converts this this string to upper case, using the rules of the user's default locale.
   1384      * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
   1385      *
   1386      * @return a new upper case string, or {@code this} if it's already all upper case.
   1387      */
   1388     public String toUpperCase() {
   1389         return CaseMapper.toUpperCase(Locale.getDefault(), this, value, offset, count);
   1390     }
   1391 
   1392     /**
   1393      * Converts this this string to upper case, using the rules of {@code locale}.
   1394      *
   1395      * <p>Most case mappings are unaffected by the language of a {@code Locale}. Exceptions include
   1396      * dotted and dotless I in Azeri and Turkish locales, and dotted and dotless I and J in
   1397      * Lithuanian locales. On the other hand, it isn't necessary to provide a Greek locale to get
   1398      * correct case mapping of Greek characters: any locale will do.
   1399      *
   1400      * <p>See <a href="http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt">http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt</a>
   1401      * for full details of context- and language-specific special cases.
   1402      *
   1403      * @return a new upper case string, or {@code this} if it's already all upper case.
   1404      */
   1405     public String toUpperCase(Locale locale) {
   1406         return CaseMapper.toUpperCase(locale, this, value, offset, count);
   1407     }
   1408 
   1409     /**
   1410      * Returns a string with no code points <code><= \\u0020</code> at
   1411      * the beginning or end.
   1412      */
   1413     public String trim() {
   1414         int start = offset, last = offset + count - 1;
   1415         int end = last;
   1416         while ((start <= end) && (value[start] <= ' ')) {
   1417             start++;
   1418         }
   1419         while ((end >= start) && (value[end] <= ' ')) {
   1420             end--;
   1421         }
   1422         if (start == offset && end == last) {
   1423             return this;
   1424         }
   1425         return new String(start, end - start + 1, value);
   1426     }
   1427 
   1428     /**
   1429      * Returns a new string containing the same {@code char}s as the given
   1430      * array. Modifying the array after creating the string has no
   1431      * effect on the string.
   1432      *
   1433      * @throws NullPointerException
   1434      *             if {@code data} is {@code null}.
   1435      */
   1436     public static String valueOf(char[] data) {
   1437         return new String(data, 0, data.length);
   1438     }
   1439 
   1440     /**
   1441      * Returns a new string containing the same {@code char}s as the given
   1442      * subset of the given array. Modifying the array after creating the string has no
   1443      * effect on the string.
   1444      *
   1445      * @throws IndexOutOfBoundsException
   1446      *             if {@code length < 0}, {@code start < 0} or {@code start + length > data.length}
   1447      * @throws NullPointerException
   1448      *             if {@code data} is {@code null}.
   1449      */
   1450     public static String valueOf(char[] data, int start, int length) {
   1451         return new String(data, start, length);
   1452     }
   1453 
   1454     /**
   1455      * Returns a new string of just the given {@code char}.
   1456      */
   1457     public static String valueOf(char value) {
   1458         String s;
   1459         if (value < 128) {
   1460             s = new String(value, 1, ASCII);
   1461         } else {
   1462             s = new String(0, 1, new char[] { value });
   1463         }
   1464         s.hashCode = value;
   1465         return s;
   1466     }
   1467 
   1468     /**
   1469      * Returns the string representation of the given double.
   1470      */
   1471     public static String valueOf(double value) {
   1472         return Double.toString(value);
   1473     }
   1474 
   1475     /**
   1476      * Returns the string representation of the given float.
   1477      */
   1478     public static String valueOf(float value) {
   1479         return Float.toString(value);
   1480     }
   1481 
   1482     /**
   1483      * Returns the string representation of the given int.
   1484      */
   1485     public static String valueOf(int value) {
   1486         return Integer.toString(value);
   1487     }
   1488 
   1489     /**
   1490      * Returns the string representation of the given long.
   1491      */
   1492     public static String valueOf(long value) {
   1493         return Long.toString(value);
   1494     }
   1495 
   1496     /**
   1497      * Converts the specified object to its string representation. If the object
   1498      * is null return the string {@code "null"}, otherwise use {@code
   1499      * toString()} to get the string representation.
   1500      *
   1501      * @param value
   1502      *            the object.
   1503      * @return the object converted to a string, or the string {@code "null"}.
   1504      */
   1505     public static String valueOf(Object value) {
   1506         return value != null ? value.toString() : "null";
   1507     }
   1508 
   1509     /**
   1510      * Converts the specified boolean to its string representation. When the
   1511      * boolean is {@code true} return {@code "true"}, otherwise return {@code
   1512      * "false"}.
   1513      *
   1514      * @param value
   1515      *            the boolean.
   1516      * @return the boolean converted to a string.
   1517      */
   1518     public static String valueOf(boolean value) {
   1519         return value ? "true" : "false";
   1520     }
   1521 
   1522     /**
   1523      * Returns true if the {@code char}s in the given {@code StringBuffer} are the same
   1524      * as those in this string.
   1525      *
   1526      * @throws NullPointerException
   1527      *             if {@code sb} is {@code null}.
   1528      * @since 1.4
   1529      */
   1530     public boolean contentEquals(StringBuffer sb) {
   1531         synchronized (sb) {
   1532             int size = sb.length();
   1533             if (count != size) {
   1534                 return false;
   1535             }
   1536             return regionMatches(0, new String(0, size, sb.getValue()), 0, size);
   1537         }
   1538     }
   1539 
   1540     /**
   1541      * Returns true if the {@code char}s in the given {@code CharSequence} are the same
   1542      * as those in this string.
   1543      *
   1544      * @since 1.5
   1545      */
   1546     public boolean contentEquals(CharSequence cs) {
   1547         if (cs == null) {
   1548             throw new NullPointerException("cs == null");
   1549         }
   1550 
   1551         int len = cs.length();
   1552 
   1553         if (len != count) {
   1554             return false;
   1555         }
   1556 
   1557         if (len == 0 && count == 0) {
   1558             return true; // since both are empty strings
   1559         }
   1560 
   1561         return regionMatches(0, cs.toString(), 0, len);
   1562     }
   1563 
   1564     /**
   1565      * Tests whether this string matches the given {@code regularExpression}. This method returns
   1566      * true only if the regular expression matches the <i>entire</i> input string. A common mistake is
   1567      * to assume that this method behaves like {@link #contains}; if you want to match anywhere
   1568      * within the input string, you need to add {@code .*} to the beginning and end of your
   1569      * regular expression. See {@link Pattern#matches}.
   1570      *
   1571      * <p>If the same regular expression is to be used for multiple operations, it may be more
   1572      * efficient to reuse a compiled {@code Pattern}.
   1573      *
   1574      * @throws PatternSyntaxException
   1575      *             if the syntax of the supplied regular expression is not
   1576      *             valid.
   1577      * @throws NullPointerException if {@code regularExpression == null}
   1578      * @since 1.4
   1579      */
   1580     public boolean matches(String regularExpression) {
   1581         return Pattern.matches(regularExpression, this);
   1582     }
   1583 
   1584     /**
   1585      * Replaces all matches for {@code regularExpression} within this string with the given
   1586      * {@code replacement}.
   1587      * See {@link Pattern} for regular expression syntax.
   1588      *
   1589      * <p>If the same regular expression is to be used for multiple operations, it may be more
   1590      * efficient to reuse a compiled {@code Pattern}.
   1591      *
   1592      * @throws PatternSyntaxException
   1593      *             if the syntax of the supplied regular expression is not
   1594      *             valid.
   1595      * @throws NullPointerException if {@code regularExpression == null}
   1596      * @see Pattern
   1597      * @since 1.4
   1598      */
   1599     public String replaceAll(String regularExpression, String replacement) {
   1600         return Pattern.compile(regularExpression).matcher(this).replaceAll(replacement);
   1601     }
   1602 
   1603     /**
   1604      * Replaces the first match for {@code regularExpression} within this string with the given
   1605      * {@code replacement}.
   1606      * See {@link Pattern} for regular expression syntax.
   1607      *
   1608      * <p>If the same regular expression is to be used for multiple operations, it may be more
   1609      * efficient to reuse a compiled {@code Pattern}.
   1610      *
   1611      * @throws PatternSyntaxException
   1612      *             if the syntax of the supplied regular expression is not
   1613      *             valid.
   1614      * @throws NullPointerException if {@code regularExpression == null}
   1615      * @see Pattern
   1616      * @since 1.4
   1617      */
   1618     public String replaceFirst(String regularExpression, String replacement) {
   1619         return Pattern.compile(regularExpression).matcher(this).replaceFirst(replacement);
   1620     }
   1621 
   1622     /**
   1623      * Splits this string using the supplied {@code regularExpression}.
   1624      * Equivalent to {@code split(regularExpression, 0)}.
   1625      * See {@link Pattern#split(CharSequence, int)} for an explanation of {@code limit}.
   1626      * See {@link Pattern} for regular expression syntax.
   1627      *
   1628      * <p>If the same regular expression is to be used for multiple operations, it may be more
   1629      * efficient to reuse a compiled {@code Pattern}.
   1630      *
   1631      * @throws NullPointerException if {@code regularExpression ==  null}
   1632      * @throws PatternSyntaxException
   1633      *             if the syntax of the supplied regular expression is not
   1634      *             valid.
   1635      * @see Pattern
   1636      * @since 1.4
   1637      */
   1638     public String[] split(String regularExpression) {
   1639         return split(regularExpression, 0);
   1640     }
   1641 
   1642     /**
   1643      * Splits this string using the supplied {@code regularExpression}.
   1644      * See {@link Pattern#split(CharSequence, int)} for an explanation of {@code limit}.
   1645      * See {@link Pattern} for regular expression syntax.
   1646      *
   1647      * <p>If the same regular expression is to be used for multiple operations, it may be more
   1648      * efficient to reuse a compiled {@code Pattern}.
   1649      *
   1650      * @throws NullPointerException if {@code regularExpression ==  null}
   1651      * @throws PatternSyntaxException
   1652      *             if the syntax of the supplied regular expression is not
   1653      *             valid.
   1654      * @since 1.4
   1655      */
   1656     public String[] split(String regularExpression, int limit) {
   1657         String[] result = java.util.regex.Splitter.fastSplit(regularExpression, this, limit);
   1658         return result != null ? result : Pattern.compile(regularExpression).split(this, limit);
   1659     }
   1660 
   1661     /**
   1662      * Equivalent to {@link #substring(int, int)} but needed to implement {@code CharSequence}.
   1663      *
   1664      * @throws IndexOutOfBoundsException
   1665      *             if {@code start < 0}, {@code end < 0}, {@code start > end} or
   1666      *             {@code end > length()}.
   1667      * @see java.lang.CharSequence#subSequence(int, int)
   1668      * @since 1.4
   1669      */
   1670     public CharSequence subSequence(int start, int end) {
   1671         return substring(start, end);
   1672     }
   1673 
   1674     /**
   1675      * Returns the Unicode code point at the given {@code index}.
   1676      *
   1677      * @throws IndexOutOfBoundsException if {@code index < 0 || index >= length()}
   1678      * @see Character#codePointAt(char[], int, int)
   1679      * @since 1.5
   1680      */
   1681     public int codePointAt(int index) {
   1682         if (index < 0 || index >= count) {
   1683             throw indexAndLength(index);
   1684         }
   1685         return Character.codePointAt(value, offset + index, offset + count);
   1686     }
   1687 
   1688     /**
   1689      * Returns the Unicode code point that precedes the given {@code index}.
   1690      *
   1691      * @throws IndexOutOfBoundsException if {@code index < 1 || index > length()}
   1692      * @see Character#codePointBefore(char[], int, int)
   1693      * @since 1.5
   1694      */
   1695     public int codePointBefore(int index) {
   1696         if (index < 1 || index > count) {
   1697             throw indexAndLength(index);
   1698         }
   1699         return Character.codePointBefore(value, offset + index, offset);
   1700     }
   1701 
   1702     /**
   1703      * Calculates the number of Unicode code points between {@code start}
   1704      * and {@code end}.
   1705      *
   1706      * @param start
   1707      *            the inclusive beginning index of the subsequence.
   1708      * @param end
   1709      *            the exclusive end index of the subsequence.
   1710      * @return the number of Unicode code points in the subsequence.
   1711      * @throws IndexOutOfBoundsException
   1712      *         if {@code start < 0 || end > length() || start > end}
   1713      * @see Character#codePointCount(CharSequence, int, int)
   1714      * @since 1.5
   1715      */
   1716     public int codePointCount(int start, int end) {
   1717         if (start < 0 || end > count || start > end) {
   1718             throw startEndAndLength(start, end);
   1719         }
   1720         return Character.codePointCount(value, offset + start, end - start);
   1721     }
   1722 
   1723     /**
   1724      * Returns true if this string contains the {@code chars}s from the given {@code CharSequence}.
   1725      *
   1726      * @since 1.5
   1727      */
   1728     public boolean contains(CharSequence cs) {
   1729         if (cs == null) {
   1730             throw new NullPointerException("cs == null");
   1731         }
   1732         return indexOf(cs.toString()) >= 0;
   1733     }
   1734 
   1735     /**
   1736      * Returns the index within this object that is offset from {@code index} by
   1737      * {@code codePointOffset} code points.
   1738      *
   1739      * @param index
   1740      *            the index within this object to calculate the offset from.
   1741      * @param codePointOffset
   1742      *            the number of code points to count.
   1743      * @return the index within this object that is the offset.
   1744      * @throws IndexOutOfBoundsException
   1745      *             if {@code index} is negative or greater than {@code length()}
   1746      *             or if there aren't enough code points before or after {@code
   1747      *             index} to match {@code codePointOffset}.
   1748      * @since 1.5
   1749      */
   1750     public int offsetByCodePoints(int index, int codePointOffset) {
   1751         int s = index + offset;
   1752         int r = Character.offsetByCodePoints(value, offset, count, s, codePointOffset);
   1753         return r - offset;
   1754     }
   1755 
   1756     /**
   1757      * Returns a localized formatted string, using the supplied format and arguments,
   1758      * using the user's default locale.
   1759      *
   1760      * <p>If you're formatting a string other than for human
   1761      * consumption, you should use the {@code format(Locale, String, Object...)}
   1762      * overload and supply {@code Locale.US}. See
   1763      * "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
   1764      *
   1765      * @param format the format string (see {@link java.util.Formatter#format})
   1766      * @param args
   1767      *            the list of arguments passed to the formatter. If there are
   1768      *            more arguments than required by {@code format},
   1769      *            additional arguments are ignored.
   1770      * @return the formatted string.
   1771      * @throws NullPointerException if {@code format == null}
   1772      * @throws java.util.IllegalFormatException
   1773      *             if the format is invalid.
   1774      * @since 1.5
   1775      */
   1776     public static String format(String format, Object... args) {
   1777         return format(Locale.getDefault(), format, args);
   1778     }
   1779 
   1780     /**
   1781      * Returns a formatted string, using the supplied format and arguments,
   1782      * localized to the given locale.
   1783      *
   1784      * @param locale
   1785      *            the locale to apply; {@code null} value means no localization.
   1786      * @param format the format string (see {@link java.util.Formatter#format})
   1787      * @param args
   1788      *            the list of arguments passed to the formatter. If there are
   1789      *            more arguments than required by {@code format},
   1790      *            additional arguments are ignored.
   1791      * @return the formatted string.
   1792      * @throws NullPointerException if {@code format == null}
   1793      * @throws java.util.IllegalFormatException
   1794      *             if the format is invalid.
   1795      * @since 1.5
   1796      */
   1797     public static String format(Locale locale, String format, Object... args) {
   1798         if (format == null) {
   1799             throw new NullPointerException("format == null");
   1800         }
   1801         int bufferSize = format.length() + (args == null ? 0 : args.length * 10);
   1802         Formatter f = new Formatter(new StringBuilder(bufferSize), locale);
   1803         return f.format(format, args).toString();
   1804     }
   1805 
   1806     /*
   1807      * An implementation of a String.indexOf that is supposed to perform
   1808      * substantially better than the default algorithm if the "needle" (the
   1809      * subString being searched for) is a constant string.
   1810      *
   1811      * For example, a JIT, upon encountering a call to String.indexOf(String),
   1812      * where the needle is a constant string, may compute the values cache, md2
   1813      * and lastChar, and change the call to the following method.
   1814      */
   1815     @FindBugsSuppressWarnings("UPM_UNCALLED_PRIVATE_METHOD")
   1816     @SuppressWarnings("unused")
   1817     private static int indexOf(String haystackString, String needleString,
   1818             int cache, int md2, char lastChar) {
   1819         char[] haystack = haystackString.value;
   1820         int haystackOffset = haystackString.offset;
   1821         int haystackLength = haystackString.count;
   1822         char[] needle = needleString.value;
   1823         int needleOffset = needleString.offset;
   1824         int needleLength = needleString.count;
   1825         int needleLengthMinus1 = needleLength - 1;
   1826         int haystackEnd = haystackOffset + haystackLength;
   1827         outer_loop: for (int i = haystackOffset + needleLengthMinus1; i < haystackEnd;) {
   1828             if (lastChar == haystack[i]) {
   1829                 for (int j = 0; j < needleLengthMinus1; ++j) {
   1830                     if (needle[j + needleOffset] != haystack[i + j
   1831                             - needleLengthMinus1]) {
   1832                         int skip = 1;
   1833                         if ((cache & (1 << haystack[i])) == 0) {
   1834                             skip += j;
   1835                         }
   1836                         i += Math.max(md2, skip);
   1837                         continue outer_loop;
   1838                     }
   1839                 }
   1840                 return i - needleLengthMinus1 - haystackOffset;
   1841             }
   1842 
   1843             if ((cache & (1 << haystack[i])) == 0) {
   1844                 i += needleLengthMinus1;
   1845             }
   1846             i++;
   1847         }
   1848         return -1;
   1849     }
   1850 }
   1851