java String源码

  1. /* 
  2.  * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. 
  3.  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 
  4.  * 
  5.  * 
  6.  * 
  7.  * 
  8.  * 
  9.  * 
  10.  * 
  11.  * 
  12.  * 
  13.  * 
  14.  * 
  15.  * 
  16.  * 
  17.  * 
  18.  * 
  19.  * 
  20.  * 
  21.  * 
  22.  * 
  23.  * 
  24.  */  
  25. package java.lang;  
  26.   
  27. import java.io.ObjectStreamField;  
  28. import java.io.UnsupportedEncodingException;  
  29. import java.nio.charset.Charset;  
  30. import java.util.ArrayList;  
  31. import java.util.Arrays;  
  32. import java.util.Comparator;  
  33. import java.util.Formatter;  
  34. import java.util.Locale;  
  35. import java.util.regex.Matcher;  
  36. import java.util.regex.Pattern;  
  37. import java.util.regex.PatternSyntaxException;  
  38.   
  39. /** 
  40.  * The String class represents character strings. All 
  41.  * string literals in Java programs, such as "abc", are 
  42.  * implemented as instances of this class. 
  43.  * 

     

  44.  * Strings are constant; their values cannot be changed after they 
  45.  * are created. String buffers support mutable strings. 
  46.  * Because String objects are immutable they can be shared. For example: 
  47.  * 

     
  48.  *     String str = "abc"; 
  49.  * 

     

  50.  * is equivalent to: 
  51.  * 

     
  52.  *     char data[] = {'a', 'b', 'c'}; 
  53.  *     String str = new String(data); 
  54.  * 

     

  55.  * Here are some more examples of how strings can be used: 
  56.  * 

     
  57.  *     System.out.println("abc"); 
  58.  *     String cde = "cde"; 
  59.  *     System.out.println("abc" + cde); 
  60.  *     String c = "abc".substring(2,3); 
  61.  *     String d = cde.substring(1, 2); 
  62.  *  
  63.  * 

     

  64.  * The class String includes methods for examining 
  65.  * individual characters of the sequence, for comparing strings, for 
  66.  * searching strings, for extracting substrings, and for creating a 
  67.  * copy of a string with all characters translated to uppercase or to 
  68.  * lowercase. Case mapping is based on the Unicode Standard version 
  69.  * specified by the {@link java.lang.Character Character} class. 
  70.  * 

     

  71.  * The Java language provides special support for the string 
  72.  * concatenation operator ( + ), and for conversion of 
  73.  * other objects to strings. String concatenation is implemented 
  74.  * through the StringBuilder(or StringBuffer) 
  75.  * class and its append method. 
  76.  * String conversions are implemented through the method 
  77.  * toString, defined by Object and 
  78.  * inherited by all classes in Java. For additional information on 
  79.  * string concatenation and conversion, see Gosling, Joy, and Steele, 
  80.  * The Java Language Specification. 
  81.  * 
  82.  * 

     Unless otherwise noted, passing a null argument to a constructor 

  83.  * or method in this class will cause a {@link NullPointerException} to be 
  84.  * thrown. 
  85.  * 
  86.  * 

    String represents a string in the UTF-16 format 

  87.  * in which supplementary characters are represented by surrogate 
  88.  * pairs (see the section Unicode 
  89.  * Character Representations in the Character class for 
  90.  * more information). 
  91.  * Index values refer to char code units, so a supplementary 
  92.  * character uses two positions in a String. 
  93.  * 

    The String class provides methods for dealing with 

  94.  * Unicode code points (i.e., characters), in addition to those for 
  95.  * dealing with Unicode code units (i.e., char values). 
  96.  * 
  97.  * @author  Lee Boynton 
  98.  * @author  Arthur van Hoff 
  99.  * @author  Martin Buchholz 
  100.  * @author  Ulf Zibis 
  101.  * @see     java.lang.Object#toString() 
  102.  * @see     java.lang.StringBuffer 
  103.  * @see     java.lang.StringBuilder 
  104.  * @see     java.nio.charset.Charset 
  105.  * @since   JDK1.0 
  106.  */  
  107.   
  108. public final class String  
  109.     implements java.io.Serializable, Comparable, CharSequence {  
  110.     /** The value is used for character storage. */  
  111.     private final char value[];  
  112.   
  113.     /** Cache the hash code for the string */  
  114.     private int hash; // Default to 0  
  115.   
  116.     /** use serialVersionUID from JDK 1.0.2 for interoperability */  
  117.     private static final long serialVersionUID = -6849794470754667710L;  
  118.   
  119.     /** 
  120.      * Class String is special cased within the Serialization Stream Protocol. 
  121.      * 
  122.      * A String instance is written initially into an ObjectOutputStream in the 
  123.      * following format: 
  124.      * 
     
  125.      *      TC_STRING (utf String) 
  126.      *  
  127.      * The String is written by method DataOutput.writeUTF. 
  128.      * A new handle is generated to  refer to all future references to the 
  129.      * string instance within the stream. 
  130.      */  
  131.     private static final ObjectStreamField[] serialPersistentFields =  
  132.             new ObjectStreamField[0];  
  133.   
  134.     /** 
  135.      * Initializes a newly created {@code String} object so that it represents 
  136.      * an empty character sequence.  Note that use of this constructor is 
  137.      * unnecessary since Strings are immutable. 
  138.      */  
  139.     public String() {  
  140.         this.value = new char[0];  
  141.     }  
  142.   
  143.     /** 
  144.      * Initializes a newly created {@code String} object so that it represents 
  145.      * the same sequence of characters as the argument; in other words, the 
  146.      * newly created string is a copy of the argument string. Unless an 
  147.      * explicit copy of {@code original} is needed, use of this constructor is 
  148.      * unnecessary since Strings are immutable. 
  149.      * 
  150.      * @param  original 
  151.      *         A {@code String} 
  152.      */  
  153.     public String(String original) {  
  154.         this.value = original.value;  
  155.         this.hash = original.hash;  
  156.     }  
  157.   
  158.     /** 
  159.      * Allocates a new {@code String} so that it represents the sequence of 
  160.      * characters currently contained in the character array argument. The 
  161.      * contents of the character array are copied; subsequent modification of 
  162.      * the character array does not affect the newly created string. 
  163.      * 
  164.      * @param  value 
  165.      *         The initial value of the string 
  166.      */  
  167.     public String(char value[]) {  
  168.         this.value = Arrays.copyOf(value, value.length);  
  169.     }  
  170.   
  171.     /** 
  172.      * Allocates a new {@code String} that contains characters from a subarray 
  173.      * of the character array argument. The {@code offset} argument is the 
  174.      * index of the first character of the subarray and the {@code count} 
  175.      * argument specifies the length of the subarray. The contents of the 
  176.      * subarray are copied; subsequent modification of the character array does 
  177.      * not affect the newly created string. 
  178.      * 
  179.      * @param  value 
  180.      *         Array that is the source of characters 
  181.      * 
  182.      * @param  offset 
  183.      *         The initial offset 
  184.      * 
  185.      * @param  count 
  186.      *         The length 
  187.      * 
  188.      * @throws  IndexOutOfBoundsException 
  189.      *          If the {@code offset} and {@code count} arguments index 
  190.      *          characters outside the bounds of the {@code value} array 
  191.      */  
  192.     public String(char value[], int offset, int count) {  
  193.         if (offset < 0) {  
  194.             throw new StringIndexOutOfBoundsException(offset);  
  195.         }  
  196.         if (count < 0) {  
  197.             throw new StringIndexOutOfBoundsException(count);  
  198.         }  
  199.         // Note: offset or count might be near -1>>>1.  
  200.         if (offset > value.length - count) {  
  201.             throw new StringIndexOutOfBoundsException(offset + count);  
  202.         }  
  203.         this.value = Arrays.copyOfRange(value, offset, offset+count);  
  204.     }  
  205.   
  206.     /** 
  207.      * Allocates a new {@code String} that contains characters from a subarray 
  208.      * of the Unicode code point array 
  209.      * argument.  The {@code offset} argument is the index of the first code 
  210.      * point of the subarray and the {@code count} argument specifies the 
  211.      * length of the subarray.  The contents of the subarray are converted to 
  212.      * {@code char}s; subsequent modification of the {@code int} array does not 
  213.      * affect the newly created string. 
  214.      * 
  215.      * @param  codePoints 
  216.      *         Array that is the source of Unicode code points 
  217.      * 
  218.      * @param  offset 
  219.      *         The initial offset 
  220.      * 
  221.      * @param  count 
  222.      *         The length 
  223.      * 
  224.      * @throws  IllegalArgumentException 
  225.      *          If any invalid Unicode code point is found in {@code 
  226.      *          codePoints} 
  227.      * 
  228.      * @throws  IndexOutOfBoundsException 
  229.      *          If the {@code offset} and {@code count} arguments index 
  230.      *          characters outside the bounds of the {@code codePoints} array 
  231.      * 
  232.      * @since  1.5 
  233.      */  
  234.     public String(int[] codePoints, int offset, int count) {  
  235.         if (offset < 0) {  
  236.             throw new StringIndexOutOfBoundsException(offset);  
  237.         }  
  238.         if (count < 0) {  
  239.             throw new StringIndexOutOfBoundsException(count);  
  240.         }  
  241.         // Note: offset or count might be near -1>>>1.  
  242.         if (offset > codePoints.length - count) {  
  243.             throw new StringIndexOutOfBoundsException(offset + count);  
  244.         }  
  245.   
  246.         final int end = offset + count;  
  247.   
  248.         // Pass 1: Compute precise size of char[]  
  249.         int n = count;  
  250.         for (int i = offset; i < end; i++) {  
  251.             int c = codePoints[i];  
  252.             if (Character.isBmpCodePoint(c))  
  253.                 continue;  
  254.             else if (Character.isValidCodePoint(c))  
  255.                 n++;  
  256.             else throw new IllegalArgumentException(Integer.toString(c));  
  257.         }  
  258.   
  259.         // Pass 2: Allocate and fill in char[]  
  260.         final char[] v = new char[n];  
  261.   
  262.         for (int i = offset, j = 0; i < end; i++, j++) {  
  263.             int c = codePoints[i];  
  264.             if (Character.isBmpCodePoint(c))  
  265.                 v[j] = (char)c;  
  266.             else  
  267.                 Character.toSurrogates(c, v, j++);  
  268.         }  
  269.   
  270.         this.value = v;  
  271.     }  
  272.   
  273.     /** 
  274.      * Allocates a new {@code String} constructed from a subarray of an array 
  275.      * of 8-bit integer values. 
  276.      * 
  277.      * 

     The {@code offset} argument is the index of the first byte of the 

  278.      * subarray, and the {@code count} argument specifies the length of the 
  279.      * subarray. 
  280.      * 
  281.      * 

     Each {@code byte} in the subarray is converted to a {@code char} as 

  282.      * specified in the method above. 
  283.      * 
  284.      * @deprecated This method does not properly convert bytes into characters. 
  285.      * As of JDK 1.1, the preferred way to do this is via the 
  286.      * {@code String} constructors that take a {@link 
  287.      * java.nio.charset.Charset}, charset name, or that use the platform's 
  288.      * default charset. 
  289.      * 
  290.      * @param  ascii 
  291.      *         The bytes to be converted to characters 
  292.      * 
  293.      * @param  hibyte 
  294.      *         The top 8 bits of each 16-bit Unicode code unit 
  295.      * 
  296.      * @param  offset 
  297.      *         The initial offset 
  298.      * @param  count 
  299.      *         The length 
  300.      * 
  301.      * @throws  IndexOutOfBoundsException 
  302.      *          If the {@code offset} or {@code count} argument is invalid 
  303.      * 
  304.      * @see  #String(byte[], int) 
  305.      * @see  #String(byte[], int, int, java.lang.String) 
  306.      * @see  #String(byte[], int, int, java.nio.charset.Charset) 
  307.      * @see  #String(byte[], int, int) 
  308.      * @see  #String(byte[], java.lang.String) 
  309.      * @see  #String(byte[], java.nio.charset.Charset) 
  310.      * @see  #String(byte[]) 
  311.      */  
  312.     @Deprecated  
  313.     public String(byte ascii[], int hibyte, int offset, int count) {  
  314.         checkBounds(ascii, offset, count);  
  315.         char value[] = new char[count];  
  316.   
  317.         if (hibyte == 0) {  
  318.             for (int i = count; i-- > 0;) {  
  319.                 value[i] = (char)(ascii[i + offset] & 0xff);  
  320.             }  
  321.         } else {  
  322.             hibyte <<= 8;  
  323.             for (int i = count; i-- > 0;) {  
  324.                 value[i] = (char)(hibyte | (ascii[i + offset] & 0xff));  
  325.             }  
  326.         }  
  327.         this.value = value;  
  328.     }  
  329.   
  330.     /** 
  331.      * Allocates a new {@code String} containing characters constructed from 
  332.      * an array of 8-bit integer values. Each character cin the 
  333.      * resulting string is constructed from the corresponding component 
  334.      * b in the byte array such that: 
  335.      * 
  336.      * 
     
  337.      *     c == (char)(((hibyte & 0xff) << 8) 
  338.      *                         | (b & 0xff)) 
  339.      *  
  340.      * 
  341.      * @deprecated  This method does not properly convert bytes into 
  342.      * characters.  As of JDK 1.1, the preferred way to do this is via the 
  343.      * {@code String} constructors that take a {@link 
  344.      * java.nio.charset.Charset}, charset name, or that use the platform's 
  345.      * default charset. 
  346.      * 
  347.      * @param  ascii 
  348.      *         The bytes to be converted to characters 
  349.      * 
  350.      * @param  hibyte 
  351.      *         The top 8 bits of each 16-bit Unicode code unit 
  352.      * 
  353.      * @see  #String(byte[], int, int, java.lang.String) 
  354.      * @see  #String(byte[], int, int, java.nio.charset.Charset) 
  355.      * @see  #String(byte[], int, int) 
  356.      * @see  #String(byte[], java.lang.String) 
  357.      * @see  #String(byte[], java.nio.charset.Charset) 
  358.      * @see  #String(byte[]) 
  359.      */  
  360.     @Deprecated  
  361.     public String(byte ascii[], int hibyte) {  
  362.         this(ascii, hibyte, 0, ascii.length);  
  363.     }  
  364.   
  365.     /* Common private utility method used to bounds check the byte array 
  366.      * and requested offset & length values used by the String(byte[],..) 
  367.      * constructors. 
  368.      */  
  369.     private static void checkBounds(byte[] bytes, int offset, int length) {  
  370.         if (length < 0)  
  371.             throw new StringIndexOutOfBoundsException(length);  
  372.         if (offset < 0)  
  373.             throw new StringIndexOutOfBoundsException(offset);  
  374.         if (offset > bytes.length - length)  
  375.             throw new StringIndexOutOfBoundsException(offset + length);  
  376.     }  
  377.   
  378.     /** 
  379.      * Constructs a new {@code String} by decoding the specified subarray of 
  380.      * bytes using the specified charset.  The length of the new {@code String} 
  381.      * is a function of the charset, and hence may not be equal to the length 
  382.      * of the subarray. 
  383.      * 
  384.      * 

     The behavior of this constructor when the given bytes are not valid 

  385.      * in the given charset is unspecified.  The {@link 
  386.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  387.      * over the decoding process is required. 
  388.      * 
  389.      * @param  bytes 
  390.      *         The bytes to be decoded into characters 
  391.      * 
  392.      * @param  offset 
  393.      *         The index of the first byte to decode 
  394.      * 
  395.      * @param  length 
  396.      *         The number of bytes to decode 
  397.  
  398.      * @param  charsetName 
  399.      *         The name of a supported {@linkplain java.nio.charset.Charset 
  400.      *         charset} 
  401.      * 
  402.      * @throws  UnsupportedEncodingException 
  403.      *          If the named charset is not supported 
  404.      * 
  405.      * @throws  IndexOutOfBoundsException 
  406.      *          If the {@code offset} and {@code length} arguments index 
  407.      *          characters outside the bounds of the {@code bytes} array 
  408.      * 
  409.      * @since  JDK1.1 
  410.      */  
  411.     public String(byte bytes[], int offset, int length, String charsetName)  
  412.             throws UnsupportedEncodingException {  
  413.         if (charsetName == null)  
  414.             throw new NullPointerException("charsetName");  
  415.         checkBounds(bytes, offset, length);  
  416.         this.value = StringCoding.decode(charsetName, bytes, offset, length);  
  417.     }  
  418.   
  419.     /** 
  420.      * Constructs a new {@code String} by decoding the specified subarray of 
  421.      * bytes using the specified {@linkplain java.nio.charset.Charset charset}. 
  422.      * The length of the new {@code String} is a function of the charset, and 
  423.      * hence may not be equal to the length of the subarray. 
  424.      * 
  425.      * 

     This method always replaces malformed-input and unmappable-character 

  426.      * sequences with this charset's default replacement string.  The {@link 
  427.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  428.      * over the decoding process is required. 
  429.      * 
  430.      * @param  bytes 
  431.      *         The bytes to be decoded into characters 
  432.      * 
  433.      * @param  offset 
  434.      *         The index of the first byte to decode 
  435.      * 
  436.      * @param  length 
  437.      *         The number of bytes to decode 
  438.      * 
  439.      * @param  charset 
  440.      *         The {@linkplain java.nio.charset.Charset charset} to be used to 
  441.      *         decode the {@code bytes} 
  442.      * 
  443.      * @throws  IndexOutOfBoundsException 
  444.      *          If the {@code offset} and {@code length} arguments index 
  445.      *          characters outside the bounds of the {@code bytes} array 
  446.      * 
  447.      * @since  1.6 
  448.      */  
  449.     public String(byte bytes[], int offset, int length, Charset charset) {  
  450.         if (charset == null)  
  451.             throw new NullPointerException("charset");  
  452.         checkBounds(bytes, offset, length);  
  453.         this.value =  StringCoding.decode(charset, bytes, offset, length);  
  454.     }  
  455.   
  456.     /** 
  457.      * Constructs a new {@code String} by decoding the specified array of bytes 
  458.      * using the specified {@linkplain java.nio.charset.Charset charset}.  The 
  459.      * length of the new {@code String} is a function of the charset, and hence 
  460.      * may not be equal to the length of the byte array. 
  461.      * 
  462.      * 

     The behavior of this constructor when the given bytes are not valid 

  463.      * in the given charset is unspecified.  The {@link 
  464.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  465.      * over the decoding process is required. 
  466.      * 
  467.      * @param  bytes 
  468.      *         The bytes to be decoded into characters 
  469.      * 
  470.      * @param  charsetName 
  471.      *         The name of a supported {@linkplain java.nio.charset.Charset 
  472.      *         charset} 
  473.      * 
  474.      * @throws  UnsupportedEncodingException 
  475.      *          If the named charset is not supported 
  476.      * 
  477.      * @since  JDK1.1 
  478.      */  
  479.     public String(byte bytes[], String charsetName)  
  480.             throws UnsupportedEncodingException {  
  481.         this(bytes, 0, bytes.length, charsetName);  
  482.     }  
  483.   
  484.     /** 
  485.      * Constructs a new {@code String} by decoding the specified array of 
  486.      * bytes using the specified {@linkplain java.nio.charset.Charset charset}. 
  487.      * The length of the new {@code String} is a function of the charset, and 
  488.      * hence may not be equal to the length of the byte array. 
  489.      * 
  490.      * 

     This method always replaces malformed-input and unmappable-character 

  491.      * sequences with this charset's default replacement string.  The {@link 
  492.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  493.      * over the decoding process is required. 
  494.      * 
  495.      * @param  bytes 
  496.      *         The bytes to be decoded into characters 
  497.      * 
  498.      * @param  charset 
  499.      *         The {@linkplain java.nio.charset.Charset charset} to be used to 
  500.      *         decode the {@code bytes} 
  501.      * 
  502.      * @since  1.6 
  503.      */  
  504.     public String(byte bytes[], Charset charset) {  
  505.         this(bytes, 0, bytes.length, charset);  
  506.     }  
  507.   
  508.     /** 
  509.      * Constructs a new {@code String} by decoding the specified subarray of 
  510.      * bytes using the platform's default charset.  The length of the new 
  511.      * {@code String} is a function of the charset, and hence may not be equal 
  512.      * to the length of the subarray. 
  513.      * 
  514.      * 

     The behavior of this constructor when the given bytes are not valid 

  515.      * in the default charset is unspecified.  The {@link 
  516.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  517.      * over the decoding process is required. 
  518.      * 
  519.      * @param  bytes 
  520.      *         The bytes to be decoded into characters 
  521.      * 
  522.      * @param  offset 
  523.      *         The index of the first byte to decode 
  524.      * 
  525.      * @param  length 
  526.      *         The number of bytes to decode 
  527.      * 
  528.      * @throws  IndexOutOfBoundsException 
  529.      *          If the {@code offset} and the {@code length} arguments index 
  530.      *          characters outside the bounds of the {@code bytes} array 
  531.      * 
  532.      * @since  JDK1.1 
  533.      */  
  534.     public String(byte bytes[], int offset, int length) {  
  535.         checkBounds(bytes, offset, length);  
  536.         this.value = StringCoding.decode(bytes, offset, length);  
  537.     }  
  538.   
  539.     /** 
  540.      * Constructs a new {@code String} by decoding the specified array of bytes 
  541.      * using the platform's default charset.  The length of the new {@code 
  542.      * String} is a function of the charset, and hence may not be equal to the 
  543.      * length of the byte array. 
  544.      * 
  545.      * 

     The behavior of this constructor when the given bytes are not valid 

  546.      * in the default charset is unspecified.  The {@link 
  547.      * java.nio.charset.CharsetDecoder} class should be used when more control 
  548.      * over the decoding process is required. 
  549.      * 
  550.      * @param  bytes 
  551.      *         The bytes to be decoded into characters 
  552.      * 
  553.      * @since  JDK1.1 
  554.      */  
  555.     public String(byte bytes[]) {  
  556.         this(bytes, 0, bytes.length);  
  557.     }  
  558.   
  559.     /** 
  560.      * Allocates a new string that contains the sequence of characters 
  561.      * currently contained in the string buffer argument. The contents of the 
  562.      * string buffer are copied; subsequent modification of the string buffer 
  563.      * does not affect the newly created string. 
  564.      * 
  565.      * @param  buffer 
  566.      *         A {@code StringBuffer} 
  567.      */  
  568.     public String(StringBuffer buffer) {  
  569.         synchronized(buffer) {  
  570.             this.value = Arrays.copyOf(buffer.getValue(), buffer.length());  
  571.         }  
  572.     }  
  573.   
  574.     /** 
  575.      * Allocates a new string that contains the sequence of characters 
  576.      * currently contained in the string builder argument. The contents of the 
  577.      * string builder are copied; subsequent modification of the string builder 
  578.      * does not affect the newly created string. 
  579.      * 
  580.      * 

     This constructor is provided to ease migration to {@code 

  581.      * StringBuilder}. Obtaining a string from a string builder via the {@code 
  582.      * toString} method is likely to run faster and is generally preferred. 
  583.      * 
  584.      * @param   builder 
  585.      *          A {@code StringBuilder} 
  586.      * 
  587.      * @since  1.5 
  588.      */  
  589.     public String(StringBuilder builder) {  
  590.         this.value = Arrays.copyOf(builder.getValue(), builder.length());  
  591.     }  
  592.   
  593.     /* 
  594.     * Package private constructor which shares value array for speed. 
  595.     * this constructor is always expected to be called with share==true. 
  596.     * a separate constructor is needed because we already have a public 
  597.     * String(char[]) constructor that makes a copy of the given char[]. 
  598.     */  
  599.     String(char[] value, boolean share) {  
  600.         // assert share : "unshared not supported";  
  601.         this.value = value;  
  602.     }  
  603.   
  604.     /** 
  605.      * Package private constructor 
  606.      * 
  607.      * @deprecated Use {@link #String(char[],int,int)} instead. 
  608.      */  
  609.     @Deprecated  
  610.     String(int offset, int count, char[] value) {  
  611.         this(value, offset, count);  
  612.     }  
  613.   
  614.     /** 
  615.      * Returns the length of this string. 
  616.      * The length is equal to the number of Unicode 
  617.      * code units in the string. 
  618.      * 
  619.      * @return  the length of the sequence of characters represented by this 
  620.      *          object. 
  621.      */  
  622.     public int length() {  
  623.         return value.length;  
  624.     }  
  625.   
  626.     /** 
  627.      * Returns true if, and only if, {@link #length()} is 0. 
  628.      * 
  629.      * @return true if {@link #length()} is 0, otherwise 
  630.      * false 
  631.      * 
  632.      * @since 1.6 
  633.      */  
  634.     public boolean isEmpty() {  
  635.         return value.length == 0;  
  636.     }  
  637.   
  638.     /** 
  639.      * Returns the char value at the 
  640.      * specified index. An index ranges from 0 to 
  641.      * length() - 1. The first char value of the sequence 
  642.      * is at index 0, the next at index 1, 
  643.      * and so on, as for array indexing. 
  644.      * 
  645.      * 

    If the char value specified by the index is a 

  646.      * surrogate, the surrogate 
  647.      * value is returned. 
  648.      * 
  649.      * @param      index   the index of the char value. 
  650.      * @return     the char value at the specified index of this string. 
  651.      *             The first char value is at index 0. 
  652.      * @exception  IndexOutOfBoundsException  if the index 
  653.      *             argument is negative or not less than the length of this 
  654.      *             string. 
  655.      */  
  656.     public char charAt(int index) {  
  657.         if ((index < 0) || (index >= value.length)) {  
  658.             throw new StringIndexOutOfBoundsException(index);  
  659.         }  
  660.         return value[index];  
  661.     }  
  662.   
  663.     /** 
  664.      * Returns the character (Unicode code point) at the specified 
  665.      * index. The index refers to char values 
  666.      * (Unicode code units) and ranges from 0 to 
  667.      * {@link #length()} - 1. 
  668.      * 
  669.      * 

     If the char value specified at the given index 

  670.      * is in the high-surrogate range, the following index is less 
  671.      * than the length of this String, and the 
  672.      * char value at the following index is in the 
  673.      * low-surrogate range, then the supplementary code point 
  674.      * corresponding to this surrogate pair is returned. Otherwise, 
  675.      * the char value at the given index is returned. 
  676.      * 
  677.      * @param      index the index to the char values 
  678.      * @return     the code point value of the character at the 
  679.      *             index 
  680.      * @exception  IndexOutOfBoundsException  if the index 
  681.      *             argument is negative or not less than the length of this 
  682.      *             string. 
  683.      * @since      1.5 
  684.      */  
  685.     public int codePointAt(int index) {  
  686.         if ((index < 0) || (index >= value.length)) {  
  687.             throw new StringIndexOutOfBoundsException(index);  
  688.         }  
  689.         return Character.codePointAtImpl(value, index, value.length);  
  690.     }  
  691.   
  692.     /** 
  693.      * Returns the character (Unicode code point) before the specified 
  694.      * index. The index refers to char values 
  695.      * (Unicode code units) and ranges from 1 to {@link 
  696.      * CharSequence#length() length}. 
  697.      * 
  698.      * 

     If the char value at (index - 1) 

  699.      * is in the low-surrogate range, (index - 2) is not 
  700.      * negative, and the char value at (index - 
  701.      * 2) is in the high-surrogate range, then the 
  702.      * supplementary code point value of the surrogate pair is 
  703.      * returned. If the char value at index - 
  704.      * 1 is an unpaired low-surrogate or a high-surrogate, the 
  705.      * surrogate value is returned. 
  706.      * 
  707.      * @param     index the index following the code point that should be returned 
  708.      * @return    the Unicode code point value before the given index. 
  709.      * @exception IndexOutOfBoundsException if the index 
  710.      *            argument is less than 1 or greater than the length 
  711.      *            of this string. 
  712.      * @since     1.5 
  713.      */  
  714.     public int codePointBefore(int index) {  
  715.         int i = index - 1;  
  716.         if ((i < 0) || (i >= value.length)) {  
  717.             throw new StringIndexOutOfBoundsException(index);  
  718.         }  
  719.         return Character.codePointBeforeImpl(value, index, 0);  
  720.     }  
  721.   
  722.     /** 
  723.      * Returns the number of Unicode code points in the specified text 
  724.      * range of this String. The text range begins at the 
  725.      * specified beginIndex and extends to the 
  726.      * char at index endIndex - 1. Thus the 
  727.      * length (in chars) of the text range is 
  728.      * endIndex-beginIndex. Unpaired surrogates within 
  729.      * the text range count as one code point each. 
  730.      * 
  731.      * @param beginIndex the index to the first char of 
  732.      * the text range. 
  733.      * @param endIndex the index after the last char of 
  734.      * the text range. 
  735.      * @return the number of Unicode code points in the specified text 
  736.      * range 
  737.      * @exception IndexOutOfBoundsException if the 
  738.      * beginIndex is negative, or endIndex 
  739.      * is larger than the length of this String, or 
  740.      * beginIndex is larger than endIndex. 
  741.      * @since  1.5 
  742.      */  
  743.     public int codePointCount(int beginIndex, int endIndex) {  
  744.         if (beginIndex < 0 || endIndex > value.length || beginIndex > endIndex) {  
  745.             throw new IndexOutOfBoundsException();  
  746.         }  
  747.         return Character.codePointCountImpl(value, beginIndex, endIndex - beginIndex);  
  748.     }  
  749.   
  750.     /** 
  751.      * Returns the index within this String that is 
  752.      * offset from the given index by 
  753.      * codePointOffset code points. Unpaired surrogates 
  754.      * within the text range given by index and 
  755.      * codePointOffset count as one code point each. 
  756.      * 
  757.      * @param index the index to be offset 
  758.      * @param codePointOffset the offset in code points 
  759.      * @return the index within this String 
  760.      * @exception IndexOutOfBoundsException if index 
  761.      *   is negative or larger then the length of this 
  762.      *   String, or if codePointOffset is positive 
  763.      *   and the substring starting with index has fewer 
  764.      *   than codePointOffset code points, 
  765.      *   or if codePointOffset is negative and the substring 
  766.      *   before index has fewer than the absolute value 
  767.      *   of codePointOffset code points. 
  768.      * @since 1.5 
  769.      */  
  770.     public int offsetByCodePoints(int index, int codePointOffset) {  
  771.         if (index < 0 || index > value.length) {  
  772.             throw new IndexOutOfBoundsException();  
  773.         }  
  774.         return Character.offsetByCodePointsImpl(value, 0, value.length,  
  775.                 index, codePointOffset);  
  776.     }  
  777.   
  778.     /** 
  779.      * Copy characters from this string into dst starting at dstBegin. 
  780.      * This method doesn't perform any range checking. 
  781.      */  
  782.     void getChars(char dst[], int dstBegin) {  
  783.         System.arraycopy(value, 0, dst, dstBegin, value.length);  
  784.     }  
  785.   
  786.     /** 
  787.      * Copies characters from this string into the destination character 
  788.      * array. 
  789.      * 

     

  790.      * The first character to be copied is at index srcBegin; 
  791.      * the last character to be copied is at index srcEnd-1 
  792.      * (thus the total number of characters to be copied is 
  793.      * srcEnd-srcBegin). The characters are copied into the 
  794.      * subarray of dst starting at index dstBegin 
  795.      * and ending at index: 
  796.      * 

     
  797.      *     dstbegin + (srcEnd-srcBegin) - 1 
  798.      *  
  799.      * 
  800.      * @param      srcBegin   index of the first character in the string 
  801.      *                        to copy. 
  802.      * @param      srcEnd     index after the last character in the string 
  803.      *                        to copy. 
  804.      * @param      dst        the destination array. 
  805.      * @param      dstBegin   the start offset in the destination array. 
  806.      * @exception IndexOutOfBoundsException If any of the following 
  807.      *            is true: 
  808.      *            
    • srcBegin is negative. 
    •      *            
    • srcBegin is greater than srcEnd 
    •      *            
    • srcEnd is greater than the length of this 
    •      *                string 
    •      *            
    • dstBegin is negative 
    •      *            
    • dstBegin+(srcEnd-srcBegin) is larger than 
    •      *                dst.length
     
  809.      */  
  810.     public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {  
  811.         if (srcBegin < 0) {  
  812.             throw new StringIndexOutOfBoundsException(srcBegin);  
  813.         }  
  814.         if (srcEnd > value.length) {  
  815.             throw new StringIndexOutOfBoundsException(srcEnd);  
  816.         }  
  817.         if (srcBegin > srcEnd) {  
  818.             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);  
  819.         }  
  820.         System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);  
  821.     }  
  822.   
  823.     /** 
  824.      * Copies characters from this string into the destination byte array. Each 
  825.      * byte receives the 8 low-order bits of the corresponding character. The 
  826.      * eight high-order bits of each character are not copied and do not 
  827.      * participate in the transfer in any way. 
  828.      * 
  829.      * 

     The first character to be copied is at index {@code srcBegin}; the 

  830.      * last character to be copied is at index {@code srcEnd-1}.  The total 
  831.      * number of characters to be copied is {@code srcEnd-srcBegin}. The 
  832.      * characters, converted to bytes, are copied into the subarray of {@code 
  833.      * dst} starting at index {@code dstBegin} and ending at index: 
  834.      * 
  835.      * 
     
  836.      *     dstbegin + (srcEnd-srcBegin) - 1 
  837.      *  
  838.      * 
  839.      * @deprecated  This method does not properly convert characters into 
  840.      * bytes.  As of JDK 1.1, the preferred way to do this is via the 
  841.      * {@link #getBytes()} method, which uses the platform's default charset. 
  842.      * 
  843.      * @param  srcBegin 
  844.      *         Index of the first character in the string to copy 
  845.      * 
  846.      * @param  srcEnd 
  847.      *         Index after the last character in the string to copy 
  848.      * 
  849.      * @param  dst 
  850.      *         The destination array 
  851.      * 
  852.      * @param  dstBegin 
  853.      *         The start offset in the destination array 
  854.      * 
  855.      * @throws  IndexOutOfBoundsException 
  856.      *          If any of the following is true: 
  857.      *          
       
    •      *            
    •  {@code srcBegin} is negative 
    •      *            
    •  {@code srcBegin} is greater than {@code srcEnd} 
    •      *            
    •  {@code srcEnd} is greater than the length of this String 
    •      *            
    •  {@code dstBegin} is negative 
    •      *            
    •  {@code dstBegin+(srcEnd-srcBegin)} is larger than {@code 
    •      *                 dst.length} 
    •      *          
     
  858.      */  
  859.     @Deprecated  
  860.     public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {  
  861.         if (srcBegin < 0) {  
  862.             throw new StringIndexOutOfBoundsException(srcBegin);  
  863.         }  
  864.         if (srcEnd > value.length) {  
  865.             throw new StringIndexOutOfBoundsException(srcEnd);  
  866.         }  
  867.         if (srcBegin > srcEnd) {  
  868.             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);  
  869.         }  
  870.         int j = dstBegin;  
  871.         int n = srcEnd;  
  872.         int i = srcBegin;  
  873.         char[] val = value;   /* avoid getfield opcode */  
  874.   
  875.         while (i < n) {  
  876.             dst[j++] = (byte)val[i++];  
  877.         }  
  878.     }  
  879.   
  880.     /** 
  881.      * Encodes this {@code String} into a sequence of bytes using the named 
  882.      * charset, storing the result into a new byte array. 
  883.      * 
  884.      * 

     The behavior of this method when this string cannot be encoded in 

  885.      * the given charset is unspecified.  The {@link 
  886.      * java.nio.charset.CharsetEncoder} class should be used when more control 
  887.      * over the encoding process is required. 
  888.      * 
  889.      * @param  charsetName 
  890.      *         The name of a supported {@linkplain java.nio.charset.Charset 
  891.      *         charset} 
  892.      * 
  893.      * @return  The resultant byte array 
  894.      * 
  895.      * @throws  UnsupportedEncodingException 
  896.      *          If the named charset is not supported 
  897.      * 
  898.      * @since  JDK1.1 
  899.      */  
  900.     public byte[] getBytes(String charsetName)  
  901.             throws UnsupportedEncodingException {  
  902.         if (charsetName == nullthrow new NullPointerException();  
  903.         return StringCoding.encode(charsetName, value, 0, value.length);  
  904.     }  
  905.   
  906.     /** 
  907.      * Encodes this {@code String} into a sequence of bytes using the given 
  908.      * {@linkplain java.nio.charset.Charset charset}, storing the result into a 
  909.      * new byte array. 
  910.      * 
  911.      * 

     This method always replaces malformed-input and unmappable-character 

  912.      * sequences with this charset's default replacement byte array.  The 
  913.      * {@link java.nio.charset.CharsetEncoder} class should be used when more 
  914.      * control over the encoding process is required. 
  915.      * 
  916.      * @param  charset 
  917.      *         The {@linkplain java.nio.charset.Charset} to be used to encode 
  918.      *         the {@code String} 
  919.      * 
  920.      * @return  The resultant byte array 
  921.      * 
  922.      * @since  1.6 
  923.      */  
  924.     public byte[] getBytes(Charset charset) {  
  925.         if (charset == nullthrow new NullPointerException();  
  926.         return StringCoding.encode(charset, value, 0, value.length);  
  927.     }  
  928.   
  929.     /** 
  930.      * Encodes this {@code String} into a sequence of bytes using the 
  931.      * platform's default charset, storing the result into a new byte array. 
  932.      * 
  933.      * 

     The behavior of this method when this string cannot be encoded in 

  934.      * the default charset is unspecified.  The {@link 
  935.      * java.nio.charset.CharsetEncoder} class should be used when more control 
  936.      * over the encoding process is required. 
  937.      * 
  938.      * @return  The resultant byte array 
  939.      * 
  940.      * @since      JDK1.1 
  941.      */  
  942.     public byte[] getBytes() {  
  943.         return StringCoding.encode(value, 0, value.length);  
  944.     }  
  945.   
  946.     /** 
  947.      * Compares this string to the specified object.  The result is {@code 
  948.      * true} if and only if the argument is not {@code null} and is a {@code 
  949.      * String} object that represents the same sequence of characters as this 
  950.      * object. 
  951.      * 
  952.      * @param  anObject 
  953.      *         The object to compare this {@code String} against 
  954.      * 
  955.      * @return  {@code true} if the given object represents a {@code String} 
  956.      *          equivalent to this string, {@code false} otherwise 
  957.      * 
  958.      * @see  #compareTo(String) 
  959.      * @see  #equalsIgnoreCase(String) 
  960.      */  
  961.     public boolean equals(Object anObject) {  
  962.         if (this == anObject) {  
  963.             return true;  
  964.         }  
  965.         if (anObject instanceof String) {  
  966.             String anotherString = (String) anObject;  
  967.             int n = value.length;  
  968.             if (n == anotherString.value.length) {  
  969.                 char v1[] = value;  
  970.                 char v2[] = anotherString.value;  
  971.                 int i = 0;  
  972.                 while (n-- != 0) {  
  973.                     if (v1[i] != v2[i])  
  974.                             return false;  
  975.                     i++;  
  976.                 }  
  977.                 return true;  
  978.             }  
  979.         }  
  980.         return false;  
  981.     }  
  982.   
  983.     /** 
  984.      * Compares this string to the specified {@code StringBuffer}.  The result 
  985.      * is {@code true} if and only if this {@code String} represents the same 
  986.      * sequence of characters as the specified {@code StringBuffer}. 
  987.      * 
  988.      * @param  sb 
  989.      *         The {@code StringBuffer} to compare this {@code String} against 
  990.      * 
  991.      * @return  {@code true} if this {@code String} represents the same 
  992.      *          sequence of characters as the specified {@code StringBuffer}, 
  993.      *          {@code false} otherwise 
  994.      * 
  995.      * @since  1.4 
  996.      */  
  997.     public boolean contentEquals(StringBuffer sb) {  
  998.         synchronized (sb) {  
  999.             return contentEquals((CharSequence) sb);  
  1000.         }  
  1001.     }  
  1002.   
  1003.     /** 
  1004.      * Compares this string to the specified {@code CharSequence}.  The result 
  1005.      * is {@code true} if and only if this {@code String} represents the same 
  1006.      * sequence of char values as the specified sequence. 
  1007.      * 
  1008.      * @param  cs 
  1009.      *         The sequence to compare this {@code String} against 
  1010.      * 
  1011.      * @return  {@code true} if this {@code String} represents the same 
  1012.      *          sequence of char values as the specified sequence, {@code 
  1013.      *          false} otherwise 
  1014.      * 
  1015.      * @since  1.5 
  1016.      */  
  1017.     public boolean contentEquals(CharSequence cs) {  
  1018.         if (value.length != cs.length())  
  1019.             return false;  
  1020.         // Argument is a StringBuffer, StringBuilder  
  1021.         if (cs instanceof AbstractStringBuilder) {  
  1022.             char v1[] = value;  
  1023.             char v2[] = ((AbstractStringBuilder) cs).getValue();  
  1024.             int i = 0;  
  1025.             int n = value.length;  
  1026.             while (n-- != 0) {  
  1027.                 if (v1[i] != v2[i])  
  1028.                     return false;  
  1029.                 i++;  
  1030.             }  
  1031.             return true;  
  1032.         }  
  1033.         // Argument is a String  
  1034.         if (cs.equals(this))  
  1035.             return true;  
  1036.         // Argument is a generic CharSequence  
  1037.         char v1[] = value;  
  1038.         int i = 0;  
  1039.         int n = value.length;  
  1040.         while (n-- != 0) {  
  1041.             if (v1[i] != cs.charAt(i))  
  1042.                 return false;  
  1043.             i++;  
  1044.         }  
  1045.         return true;  
  1046.     }  
  1047.   
  1048.     /** 
  1049.      * Compares this {@code String} to another {@code String}, ignoring case 
  1050.      * considerations.  Two strings are considered equal ignoring case if they 
  1051.      * are of the same length and corresponding characters in the two strings 
  1052.      * are equal ignoring case. 
  1053.      * 
  1054.      * 

     Two characters {@code c1} and {@code c2} are considered the same 

  1055.      * ignoring case if at least one of the following is true: 
  1056.      * 
       
    •      *   
    •  The two characters are the same (as compared by the 
    •      *        {@code ==} operator) 
    •      *   
    •  Applying the method {@link 
    •      *        java.lang.Character#toUpperCase(char)} to each character 
    •      *        produces the same result 
    •      *   
    •  Applying the method {@link 
    •      *        java.lang.Character#toLowerCase(char)} to each character 
    •      *        produces the same result 
    •      * 
     
  1057.      * 
  1058.      * @param  anotherString 
  1059.      *         The {@code String} to compare this {@code String} against 
  1060.      * 
  1061.      * @return  {@code true} if the argument is not {@code null} and it 
  1062.      *          represents an equivalent {@code String} ignoring case; {@code 
  1063.      *          false} otherwise 
  1064.      * 
  1065.      * @see  #equals(Object) 
  1066.      */  
  1067.     public boolean equalsIgnoreCase(String anotherString) {  
  1068.         return (this == anotherString) ? true  
  1069.                 : (anotherString != null)  
  1070.                 && (anotherString.value.length == value.length)  
  1071.                 && regionMatches(true0, anotherString, 0, value.length);  
  1072.     }  
  1073.   
  1074.     /** 
  1075.      * Compares two strings lexicographically. 
  1076.      * The comparison is based on the Unicode value of each character in 
  1077.      * the strings. The character sequence represented by this 
  1078.      * String object is compared lexicographically to the 
  1079.      * character sequence represented by the argument string. The result is 
  1080.      * a negative integer if this String object 
  1081.      * lexicographically precedes the argument string. The result is a 
  1082.      * positive integer if this String object lexicographically 
  1083.      * follows the argument string. The result is zero if the strings 
  1084.      * are equal; compareTo returns 0 exactly when 
  1085.      * the {@link #equals(Object)} method would return true. 
  1086.      * 

     

  1087.      * This is the definition of lexicographic ordering. If two strings are 
  1088.      * different, then either they have different characters at some index 
  1089.      * that is a valid index for both strings, or their lengths are different, 
  1090.      * or both. If they have different characters at one or more index 
  1091.      * positions, let k be the smallest such index; then the string 
  1092.      * whose character at position k has the smaller value, as 
  1093.      * determined by using the < operator, lexicographically precedes the 
  1094.      * other string. In this case, compareTo returns the 
  1095.      * difference of the two character values at position k in 
  1096.      * the two string -- that is, the value: 
  1097.      * 
     
  1098.      * this.charAt(k)-anotherString.charAt(k) 
  1099.      *  
  1100.      * If there is no index position at which they differ, then the shorter 
  1101.      * string lexicographically precedes the longer string. In this case, 
  1102.      * compareTo returns the difference of the lengths of the 
  1103.      * strings -- that is, the value: 
  1104.      * 
     
  1105.      * this.length()-anotherString.length() 
  1106.      *  
  1107.      * 
  1108.      * @param   anotherString   the String to be compared. 
  1109.      * @return  the value 0 if the argument string is equal to 
  1110.      *          this string; a value less than 0 if this string 
  1111.      *          is lexicographically less than the string argument; and a 
  1112.      *          value greater than 0 if this string is 
  1113.      *          lexicographically greater than the string argument. 
  1114.      */  
  1115.     public int compareTo(String anotherString) {  
  1116.         int len1 = value.length;  
  1117.         int len2 = anotherString.value.length;  
  1118.         int lim = Math.min(len1, len2);  
  1119.         char v1[] = value;  
  1120.         char v2[] = anotherString.value;  
  1121.   
  1122.         int k = 0;  
  1123.         while (k < lim) {  
  1124.             char c1 = v1[k];  
  1125.             char c2 = v2[k];  
  1126.             if (c1 != c2) {  
  1127.                 return c1 - c2;  
  1128.             }  
  1129.             k++;  
  1130.         }  
  1131.         return len1 - len2;  
  1132.     }  
  1133.   
  1134.     /** 
  1135.      * A Comparator that orders String objects as by 
  1136.      * compareToIgnoreCase. This comparator is serializable. 
  1137.      * 

     

  1138.      * Note that this Comparator does not take locale into account, 
  1139.      * and will result in an unsatisfactory ordering for certain locales. 
  1140.      * The java.text package provides Collators to allow 
  1141.      * locale-sensitive ordering. 
  1142.      * 
  1143.      * @see     java.text.Collator#compare(String, String) 
  1144.      * @since   1.2 
  1145.      */  
  1146.     public static final Comparator CASE_INSENSITIVE_ORDER  
  1147.                                          = new CaseInsensitiveComparator();  
  1148.     private static class CaseInsensitiveComparator  
  1149.             implements Comparator, java.io.Serializable {  
  1150.         // use serialVersionUID from JDK 1.2.2 for interoperability  
  1151.         private static final long serialVersionUID = 8575799808933029326L;  
  1152.   
  1153.         public int compare(String s1, String s2) {  
  1154.             int n1 = s1.length();  
  1155.             int n2 = s2.length();  
  1156.             int min = Math.min(n1, n2);  
  1157.             for (int i = 0; i < min; i++) {  
  1158.                 char c1 = s1.charAt(i);  
  1159.                 char c2 = s2.charAt(i);  
  1160.                 if (c1 != c2) {  
  1161.                     c1 = Character.toUpperCase(c1);  
  1162.                     c2 = Character.toUpperCase(c2);  
  1163.                     if (c1 != c2) {  
  1164.                         c1 = Character.toLowerCase(c1);  
  1165.                         c2 = Character.toLowerCase(c2);  
  1166.                         if (c1 != c2) {  
  1167.                             // No overflow because of numeric promotion  
  1168.                             return c1 - c2;  
  1169.                         }  
  1170.                     }  
  1171.                 }  
  1172.             }  
  1173.             return n1 - n2;  
  1174.         }  
  1175.     }  
  1176.   
  1177.     /** 
  1178.      * Compares two strings lexicographically, ignoring case 
  1179.      * differences. This method returns an integer whose sign is that of 
  1180.      * calling compareTo with normalized versions of the strings 
  1181.      * where case differences have been eliminated by calling 
  1182.      * Character.toLowerCase(Character.toUpperCase(character)) on 
  1183.      * each character. 
  1184.      * 

     

  1185.      * Note that this method does not take locale into account, 
  1186.      * and will result in an unsatisfactory ordering for certain locales. 
  1187.      * The java.text package provides collators to allow 
  1188.      * locale-sensitive ordering. 
  1189.      * 
  1190.      * @param   str   the String to be compared. 
  1191.      * @return  a negative integer, zero, or a positive integer as the 
  1192.      *          specified String is greater than, equal to, or less 
  1193.      *          than this String, ignoring case considerations. 
  1194.      * @see     java.text.Collator#compare(String, String) 
  1195.      * @since   1.2 
  1196.      */  
  1197.     public int compareToIgnoreCase(String str) {  
  1198.         return CASE_INSENSITIVE_ORDER.compare(this, str);  
  1199.     }  
  1200.   
  1201.     /** 
  1202.      * Tests if two string regions are equal. 
  1203.      * 

     

  1204.      * A substring of this String object is compared to a substring 
  1205.      * of the argument other. The result is true if these substrings 
  1206.      * represent identical character sequences. The substring of this 
  1207.      * String object to be compared begins at index toffset 
  1208.      * and has length len. The substring of other to be compared 
  1209.      * begins at index ooffset and has length len. The 
  1210.      * result is false if and only if at least one of the following 
  1211.      * is true: 
  1212.      * 
    • toffset is negative. 
    •      * 
    • ooffset is negative. 
    •      * 
    • toffset+len is greater than the length of this 
    •      * String object. 
    •      * 
    • ooffset+len is greater than the length of the other 
    •      * argument. 
    •      * 
    • There is some nonnegative integer k less than len 
    •      * such that: 
    •      * this.charAt(toffset+k) != other.charAt(ooffset+k) 
    •      * 
     
  1213.      * 
  1214.      * @param   toffset   the starting offset of the subregion in this string. 
  1215.      * @param   other     the string argument. 
  1216.      * @param   ooffset   the starting offset of the subregion in the string 
  1217.      *                    argument. 
  1218.      * @param   len       the number of characters to compare. 
  1219.      * @return  true if the specified subregion of this string 
  1220.      *          exactly matches the specified subregion of the string argument; 
  1221.      *          false otherwise. 
  1222.      */  
  1223.     public boolean regionMatches(int toffset, String other, int ooffset,  
  1224.             int len) {  
  1225.         char ta[] = value;  
  1226.         int to = toffset;  
  1227.         char pa[] = other.value;  
  1228.         int po = ooffset;  
  1229.         // Note: toffset, ooffset, or len might be near -1>>>1.  
  1230.         if ((ooffset < 0) || (toffset < 0)  
  1231.                 || (toffset > (long)value.length - len)  
  1232.                 || (ooffset > (long)other.value.length - len)) {  
  1233.             return false;  
  1234.         }  
  1235.         while (len-- > 0) {  
  1236.             if (ta[to++] != pa[po++]) {  
  1237.                 return false;  
  1238.             }  
  1239.         }  
  1240.         return true;  
  1241.     }  
  1242.   
  1243.     /** 
  1244.      * Tests if two string regions are equal. 
  1245.      * 

     

  1246.      * A substring of this String object is compared to a substring 
  1247.      * of the argument other. The result is true if these 
  1248.      * substrings represent character sequences that are the same, ignoring 
  1249.      * case if and only if ignoreCase is true. The substring of 
  1250.      * this String object to be compared begins at index 
  1251.      * toffset and has length len. The substring of 
  1252.      * other to be compared begins at index ooffset and 
  1253.      * has length len. The result is false if and only if 
  1254.      * at least one of the following is true: 
  1255.      * 
    • toffset is negative. 
    •      * 
    • ooffset is negative. 
    •      * 
    • toffset+len is greater than the length of this 
    •      * String object. 
    •      * 
    • ooffset+len is greater than the length of the other 
    •      * argument. 
    •      * 
    • ignoreCase is false and there is some nonnegative 
    •      * integer k less than len such that: 
    •      * 
       
    •      * this.charAt(toffset+k) != other.charAt(ooffset+k) 
    •      *  
    •      * 
    • ignoreCase is true and there is some nonnegative 
    •      * integer k less than len such that: 
    •      * 
       
    •      * Character.toLowerCase(this.charAt(toffset+k)) != 
    •      Character.toLowerCase(other.charAt(ooffset+k)) 
    •      *  
    •      * and: 
    •      * 
       
    •      * Character.toUpperCase(this.charAt(toffset+k)) != 
    •      *         Character.toUpperCase(other.charAt(ooffset+k)) 
    •      *  
    •      * 
     
  1256.      * 
  1257.      * @param   ignoreCase   if true, ignore case when comparing 
  1258.      *                       characters. 
  1259.      * @param   toffset      the starting offset of the subregion in this 
  1260.      *                       string. 
  1261.      * @param   other        the string argument. 
  1262.      * @param   ooffset      the starting offset of the subregion in the string 
  1263.      *                       argument. 
  1264.      * @param   len          the number of characters to compare. 
  1265.      * @return  true if the specified subregion of this string 
  1266.      *          matches the specified subregion of the string argument; 
  1267.      *          false otherwise. Whether the matching is exact 
  1268.      *          or case insensitive depends on the ignoreCase 
  1269.      *          argument. 
  1270.      */  
  1271.     public boolean regionMatches(boolean ignoreCase, int toffset,  
  1272.             String other, int ooffset, int len) {  
  1273.         char ta[] = value;  
  1274.         int to = toffset;  
  1275.         char pa[] = other.value;  
  1276.         int po = ooffset;  
  1277.         // Note: toffset, ooffset, or len might be near -1>>>1.  
  1278.         if ((ooffset < 0) || (toffset < 0)  
  1279.                 || (toffset > (long)value.length - len)  
  1280.                 || (ooffset > (long)other.value.length - len)) {  
  1281.             return false;  
  1282.         }  
  1283.         while (len-- > 0) {  
  1284.             char c1 = ta[to++];  
  1285.             char c2 = pa[po++];  
  1286.             if (c1 == c2) {  
  1287.                 continue;  
  1288.             }  
  1289.             if (ignoreCase) {  
  1290.                 // If characters don't match but case may be ignored,  
  1291.                 // try converting both characters to uppercase.  
  1292.                 // If the results match, then the comparison scan should  
  1293.                 // continue.  
  1294.                 char u1 = Character.toUpperCase(c1);  
  1295.                 char u2 = Character.toUpperCase(c2);  
  1296.                 if (u1 == u2) {  
  1297.                     continue;  
  1298.                 }  
  1299.                 // Unfortunately, conversion to uppercase does not work properly  
  1300.                 // for the Georgian alphabet, which has strange rules about case  
  1301.                 // conversion.  So we need to make one last check before  
  1302.                 // exiting.  
  1303.                 if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {  
  1304.                     continue;  
  1305.                 }  
  1306.             }  
  1307.             return false;  
  1308.         }  
  1309.         return true;  
  1310.     }  
  1311.   
  1312.     /** 
  1313.      * Tests if the substring of this string beginning at the 
  1314.      * specified index starts with the specified prefix. 
  1315.      * 
  1316.      * @param   prefix    the prefix. 
  1317.      * @param   toffset   where to begin looking in this string. 
  1318.      * @return  true if the character sequence represented by the 
  1319.      *          argument is a prefix of the substring of this object starting 
  1320.      *          at index toffsetfalse otherwise. 
  1321.      *          The result is false if toffset is 
  1322.      *          negative or greater than the length of this 
  1323.      *          String object; otherwise the result is the same 
  1324.      *          as the result of the expression 
  1325.      *          
     
  1326.      *          this.substring(toffset).startsWith(prefix) 
  1327.      *           
  1328.      */  
  1329.     public boolean startsWith(String prefix, int toffset) {  
  1330.         char ta[] = value;  
  1331.         int to = toffset;  
  1332.         char pa[] = prefix.value;  
  1333.         int po = 0;  
  1334.         int pc = prefix.value.length;  
  1335.         // Note: toffset might be near -1>>>1.  
  1336.         if ((toffset < 0) || (toffset > value.length - pc)) {  
  1337.             return false;  
  1338.         }  
  1339.         while (--pc >= 0) {  
  1340.             if (ta[to++] != pa[po++]) {  
  1341.                 return false;  
  1342.             }  
  1343.         }  
  1344.         return true;  
  1345.     }  
  1346.   
  1347.     /** 
  1348.      * Tests if this string starts with the specified prefix. 
  1349.      * 
  1350.      * @param   prefix   the prefix. 
  1351.      * @return  true if the character sequence represented by the 
  1352.      *          argument is a prefix of the character sequence represented by 
  1353.      *          this string; false otherwise. 
  1354.      *          Note also that true will be returned if the 
  1355.      *          argument is an empty string or is equal to this 
  1356.      *          String object as determined by the 
  1357.      *          {@link #equals(Object)} method. 
  1358.      * @since   1. 0 
  1359.      */  
  1360.     public boolean startsWith(String prefix) {  
  1361.         return startsWith(prefix, 0);  
  1362.     }  
  1363.   
  1364.     /** 
  1365.      * Tests if this string ends with the specified suffix. 
  1366.      * 
  1367.      * @param   suffix   the suffix. 
  1368.      * @return  true if the character sequence represented by the 
  1369.      *          argument is a suffix of the character sequence represented by 
  1370.      *          this object; false otherwise. Note that the 
  1371.      *          result will be true if the argument is the 
  1372.      *          empty string or is equal&nb

你可能感兴趣的:(Java)