2007-12-01 00:00:00 +00:00
/ *
2013-04-02 18:41:04 -04:00
* Copyright ( c ) 1994 , 2013 , Oracle and / or its affiliates . All rights reserved .
2007-12-01 00:00:00 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
2010-05-25 15:58:33 -07:00
* published by the Free Software Foundation . Oracle designates this
2007-12-01 00:00:00 +00:00
* particular file as subject to the " Classpath " exception as provided
2010-05-25 15:58:33 -07:00
* by Oracle in the LICENSE file that accompanied this code .
2007-12-01 00:00:00 +00:00
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
2010-05-25 15:58:33 -07:00
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
2007-12-01 00:00:00 +00:00
* /
package java.lang ;
import java.io.ObjectStreamField ;
import java.io.UnsupportedEncodingException ;
import java.nio.charset.Charset ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Comparator ;
import java.util.Formatter ;
import java.util.Locale ;
2013-01-22 11:14:13 -05:00
import java.util.Objects ;
2013-04-02 18:41:04 -04:00
import java.util.StringJoiner ;
2007-12-01 00:00:00 +00:00
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
import java.util.regex.PatternSyntaxException ;
/ * *
2012-01-23 12:17:30 -08:00
* The { @code String } class represents character strings . All
* string literals in Java programs , such as { @code " abc " } , are
2007-12-01 00:00:00 +00:00
* implemented as instances of this class .
* < p >
* Strings are constant ; their values cannot be changed after they
* are created . String buffers support mutable strings .
* Because String objects are immutable they can be shared . For example :
* < p > < blockquote > < pre >
* String str = " abc " ;
* < / pre > < / blockquote > < p >
* is equivalent to :
* < p > < blockquote > < pre >
* char data [ ] = { 'a' , 'b' , 'c' } ;
* String str = new String ( data ) ;
* < / pre > < / blockquote > < p >
* Here are some more examples of how strings can be used :
* < p > < blockquote > < pre >
* System . out . println ( " abc " ) ;
* String cde = " cde " ;
* System . out . println ( " abc " + cde ) ;
* String c = " abc " . substring ( 2 , 3 ) ;
* String d = cde . substring ( 1 , 2 ) ;
* < / pre > < / blockquote >
* < p >
2012-01-23 12:17:30 -08:00
* The class { @ code String } includes methods for examining
2007-12-01 00:00:00 +00:00
* individual characters of the sequence , for comparing strings , for
* searching strings , for extracting substrings , and for creating a
* copy of a string with all characters translated to uppercase or to
* lowercase . Case mapping is based on the Unicode Standard version
* specified by the { @link java . lang . Character Character } class .
* < p >
* The Java language provides special support for the string
* concatenation operator ( & nbsp ; + & nbsp ; ) , and for conversion of
* other objects to strings . String concatenation is implemented
2012-01-23 12:17:30 -08:00
* through the { @code StringBuilder } ( or { @code StringBuffer } )
* class and its { @code append } method .
2007-12-01 00:00:00 +00:00
* String conversions are implemented through the method
2012-01-23 12:17:30 -08:00
* { @code toString } , defined by { @code Object } and
2007-12-01 00:00:00 +00:00
* inherited by all classes in Java . For additional information on
* string concatenation and conversion , see Gosling , Joy , and Steele ,
* < i > The Java Language Specification < / i > .
*
* < p > Unless otherwise noted , passing a < tt > null < / tt > argument to a constructor
* or method in this class will cause a { @link NullPointerException } to be
* thrown .
*
2012-01-23 12:17:30 -08:00
* < p > A { @code String } represents a string in the UTF - 16 format
2007-12-01 00:00:00 +00:00
* in which < em > supplementary characters < / em > are represented by < em > surrogate
* pairs < / em > ( see the section < a href = " Character.html#unicode " > Unicode
2012-01-23 12:17:30 -08:00
* Character Representations < / a > in the { @code Character } class for
2007-12-01 00:00:00 +00:00
* more information ) .
2012-01-23 12:17:30 -08:00
* Index values refer to { @code char } code units , so a supplementary
* character uses two positions in a { @code String } .
* < p > The { @code String } class provides methods for dealing with
2007-12-01 00:00:00 +00:00
* Unicode code points ( i . e . , characters ) , in addition to those for
2012-01-23 12:17:30 -08:00
* dealing with Unicode code units ( i . e . , { @code char } values ) .
2007-12-01 00:00:00 +00:00
*
* @author Lee Boynton
* @author Arthur van Hoff
2010-06-30 16:11:32 -07:00
* @author Martin Buchholz
* @author Ulf Zibis
2007-12-01 00:00:00 +00:00
* @see java . lang . Object # toString ( )
* @see java . lang . StringBuffer
* @see java . lang . StringBuilder
* @see java . nio . charset . Charset
* @since JDK1 . 0
* /
public final class String
2012-05-17 10:06:19 -07:00
implements java . io . Serializable , Comparable < String > , CharSequence {
2007-12-01 00:00:00 +00:00
/** The value is used for character storage. */
private final char value [ ] ;
/** Cache the hash code for the string */
private int hash ; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = - 6849794470754667710L ;
/ * *
* Class String is special cased within the Serialization Stream Protocol .
*
* A String instance is written initially into an ObjectOutputStream in the
* following format :
* < pre >
2012-01-23 12:17:30 -08:00
* { @code TC_STRING } ( utf String )
2007-12-01 00:00:00 +00:00
* < / pre >
2012-01-23 12:17:30 -08:00
* The String is written by method { @code DataOutput . writeUTF } .
2007-12-01 00:00:00 +00:00
* A new handle is generated to refer to all future references to the
* string instance within the stream .
* /
private static final ObjectStreamField [ ] serialPersistentFields =
2013-04-02 18:41:04 -04:00
new ObjectStreamField [ 0 ] ;
2007-12-01 00:00:00 +00:00
/ * *
* Initializes a newly created { @code String } object so that it represents
* an empty character sequence . Note that use of this constructor is
* unnecessary since Strings are immutable .
* /
public String ( ) {
this . value = new char [ 0 ] ;
}
/ * *
* Initializes a newly created { @code String } object so that it represents
* the same sequence of characters as the argument ; in other words , the
* newly created string is a copy of the argument string . Unless an
* explicit copy of { @code original } is needed , use of this constructor is
* unnecessary since Strings are immutable .
*
* @param original
* A { @code String }
* /
public String ( String original ) {
2012-05-17 10:06:19 -07:00
this . value = original . value ;
this . hash = original . hash ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Allocates a new { @code String } so that it represents the sequence of
* characters currently contained in the character array argument . The
* contents of the character array are copied ; subsequent modification of
* the character array does not affect the newly created string .
*
* @param value
* The initial value of the string
* /
public String ( char value [ ] ) {
2012-05-17 10:06:19 -07:00
this . value = Arrays . copyOf ( value , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Allocates a new { @code String } that contains characters from a subarray
* of the character array argument . The { @code offset } argument is the
* index of the first character of the subarray and the { @code count }
* argument specifies the length of the subarray . The contents of the
* subarray are copied ; subsequent modification of the character array does
* not affect the newly created string .
*
* @param value
* Array that is the source of characters
*
* @param offset
* The initial offset
*
* @param count
* The length
*
* @throws IndexOutOfBoundsException
* If the { @code offset } and { @code count } arguments index
* characters outside the bounds of the { @code value } array
* /
public String ( char value [ ] , int offset , int count ) {
if ( offset < 0 ) {
throw new StringIndexOutOfBoundsException ( offset ) ;
}
if ( count < 0 ) {
throw new StringIndexOutOfBoundsException ( count ) ;
}
// Note: offset or count might be near -1>>>1.
if ( offset > value . length - count ) {
throw new StringIndexOutOfBoundsException ( offset + count ) ;
}
this . value = Arrays . copyOfRange ( value , offset , offset + count ) ;
}
/ * *
* Allocates a new { @code String } that contains characters from a subarray
* of the < a href = " Character.html#unicode " > Unicode code point < / a > array
* argument . The { @code offset } argument is the index of the first code
* point of the subarray and the { @code count } argument specifies the
* length of the subarray . The contents of the subarray are converted to
* { @code char } s ; subsequent modification of the { @code int } array does not
* affect the newly created string .
*
* @param codePoints
* Array that is the source of Unicode code points
*
* @param offset
* The initial offset
*
* @param count
* The length
*
* @throws IllegalArgumentException
* If any invalid Unicode code point is found in { @code
* codePoints }
*
* @throws IndexOutOfBoundsException
* If the { @code offset } and { @code count } arguments index
* characters outside the bounds of the { @code codePoints } array
*
* @since 1 . 5
* /
public String ( int [ ] codePoints , int offset , int count ) {
if ( offset < 0 ) {
throw new StringIndexOutOfBoundsException ( offset ) ;
}
if ( count < 0 ) {
throw new StringIndexOutOfBoundsException ( count ) ;
}
// Note: offset or count might be near -1>>>1.
if ( offset > codePoints . length - count ) {
throw new StringIndexOutOfBoundsException ( offset + count ) ;
}
2010-06-30 16:11:32 -07:00
final int end = offset + count ;
2007-12-01 00:00:00 +00:00
// Pass 1: Compute precise size of char[]
2010-06-30 16:11:32 -07:00
int n = count ;
for ( int i = offset ; i < end ; i + + ) {
2007-12-01 00:00:00 +00:00
int c = codePoints [ i ] ;
2010-06-30 16:11:32 -07:00
if ( Character . isBmpCodePoint ( c ) )
continue ;
else if ( Character . isValidCodePoint ( c ) )
n + + ;
2007-12-01 00:00:00 +00:00
else throw new IllegalArgumentException ( Integer . toString ( c ) ) ;
}
// Pass 2: Allocate and fill in char[]
2010-06-30 16:11:32 -07:00
final char [ ] v = new char [ n ] ;
for ( int i = offset , j = 0 ; i < end ; i + + , j + + ) {
2007-12-01 00:00:00 +00:00
int c = codePoints [ i ] ;
2010-06-30 16:11:32 -07:00
if ( Character . isBmpCodePoint ( c ) )
2012-05-17 10:06:19 -07:00
v [ j ] = ( char ) c ;
2010-06-30 16:11:32 -07:00
else
Character . toSurrogates ( c , v , j + + ) ;
2007-12-01 00:00:00 +00:00
}
2012-05-17 10:06:19 -07:00
this . value = v ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Allocates a new { @code String } constructed from a subarray of an array
* of 8 - bit integer values .
*
* < p > The { @code offset } argument is the index of the first byte of the
* subarray , and the { @code count } argument specifies the length of the
* subarray .
*
* < p > Each { @code byte } in the subarray is converted to a { @code char } as
* specified in the method above .
*
* @deprecated This method does not properly convert bytes into characters .
* As of JDK & nbsp ; 1 . 1 , the preferred way to do this is via the
* { @code String } constructors that take a { @link
* java . nio . charset . Charset } , charset name , or that use the platform ' s
* default charset .
*
* @param ascii
* The bytes to be converted to characters
*
* @param hibyte
* The top 8 bits of each 16 - bit Unicode code unit
*
* @param offset
* The initial offset
* @param count
* The length
*
* @throws IndexOutOfBoundsException
* If the { @code offset } or { @code count } argument is invalid
*
* @see # String ( byte [ ] , int )
* @see # String ( byte [ ] , int , int , java . lang . String )
* @see # String ( byte [ ] , int , int , java . nio . charset . Charset )
* @see # String ( byte [ ] , int , int )
* @see # String ( byte [ ] , java . lang . String )
* @see # String ( byte [ ] , java . nio . charset . Charset )
* @see # String ( byte [ ] )
* /
@Deprecated
public String ( byte ascii [ ] , int hibyte , int offset , int count ) {
checkBounds ( ascii , offset , count ) ;
char value [ ] = new char [ count ] ;
if ( hibyte = = 0 ) {
2012-05-17 10:06:19 -07:00
for ( int i = count ; i - - > 0 ; ) {
value [ i ] = ( char ) ( ascii [ i + offset ] & 0xff ) ;
2007-12-01 00:00:00 +00:00
}
} else {
hibyte < < = 8 ;
2012-05-17 10:06:19 -07:00
for ( int i = count ; i - - > 0 ; ) {
value [ i ] = ( char ) ( hibyte | ( ascii [ i + offset ] & 0xff ) ) ;
2007-12-01 00:00:00 +00:00
}
}
this . value = value ;
}
/ * *
* Allocates a new { @code String } containing characters constructed from
* an array of 8 - bit integer values . Each character < i > c < / i > in the
* resulting string is constructed from the corresponding component
* < i > b < / i > in the byte array such that :
*
* < blockquote > < pre >
* < b > < i > c < / i > < / b > = = ( char ) ( ( ( hibyte & amp ; 0xff ) & lt ; & lt ; 8 )
* | ( < b > < i > b < / i > < / b > & amp ; 0xff ) )
* < / pre > < / blockquote >
*
* @deprecated This method does not properly convert bytes into
* characters . As of JDK & nbsp ; 1 . 1 , the preferred way to do this is via the
* { @code String } constructors that take a { @link
* java . nio . charset . Charset } , charset name , or that use the platform ' s
* default charset .
*
* @param ascii
* The bytes to be converted to characters
*
* @param hibyte
* The top 8 bits of each 16 - bit Unicode code unit
*
* @see # String ( byte [ ] , int , int , java . lang . String )
* @see # String ( byte [ ] , int , int , java . nio . charset . Charset )
* @see # String ( byte [ ] , int , int )
* @see # String ( byte [ ] , java . lang . String )
* @see # String ( byte [ ] , java . nio . charset . Charset )
* @see # String ( byte [ ] )
* /
@Deprecated
public String ( byte ascii [ ] , int hibyte ) {
this ( ascii , hibyte , 0 , ascii . length ) ;
}
/ * Common private utility method used to bounds check the byte array
* and requested offset & length values used by the String ( byte [ ] , . . )
* constructors .
* /
private static void checkBounds ( byte [ ] bytes , int offset , int length ) {
if ( length < 0 )
throw new StringIndexOutOfBoundsException ( length ) ;
if ( offset < 0 )
throw new StringIndexOutOfBoundsException ( offset ) ;
if ( offset > bytes . length - length )
throw new StringIndexOutOfBoundsException ( offset + length ) ;
}
/ * *
* Constructs a new { @code String } by decoding the specified subarray of
* bytes using the specified charset . The length of the new { @code String }
* is a function of the charset , and hence may not be equal to the length
* of the subarray .
*
* < p > The behavior of this constructor when the given bytes are not valid
* in the given charset is unspecified . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @param offset
* The index of the first byte to decode
*
* @param length
* The number of bytes to decode
* @param charsetName
* The name of a supported { @linkplain java . nio . charset . Charset
* charset }
*
* @throws UnsupportedEncodingException
* If the named charset is not supported
*
* @throws IndexOutOfBoundsException
* If the { @code offset } and { @code length } arguments index
* characters outside the bounds of the { @code bytes } array
*
* @since JDK1 . 1
* /
public String ( byte bytes [ ] , int offset , int length , String charsetName )
2012-05-17 10:06:19 -07:00
throws UnsupportedEncodingException {
2007-12-01 00:00:00 +00:00
if ( charsetName = = null )
throw new NullPointerException ( " charsetName " ) ;
checkBounds ( bytes , offset , length ) ;
2012-05-17 10:06:19 -07:00
this . value = StringCoding . decode ( charsetName , bytes , offset , length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Constructs a new { @code String } by decoding the specified subarray of
* bytes using the specified { @linkplain java . nio . charset . Charset charset } .
* The length of the new { @code String } is a function of the charset , and
* hence may not be equal to the length of the subarray .
*
* < p > This method always replaces malformed - input and unmappable - character
* sequences with this charset ' s default replacement string . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @param offset
* The index of the first byte to decode
*
* @param length
* The number of bytes to decode
*
* @param charset
* The { @linkplain java . nio . charset . Charset charset } to be used to
* decode the { @code bytes }
*
* @throws IndexOutOfBoundsException
* If the { @code offset } and { @code length } arguments index
* characters outside the bounds of the { @code bytes } array
*
* @since 1 . 6
* /
public String ( byte bytes [ ] , int offset , int length , Charset charset ) {
if ( charset = = null )
throw new NullPointerException ( " charset " ) ;
checkBounds ( bytes , offset , length ) ;
2012-05-17 10:06:19 -07:00
this . value = StringCoding . decode ( charset , bytes , offset , length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Constructs a new { @code String } by decoding the specified array of bytes
* using the specified { @linkplain java . nio . charset . Charset charset } . The
* length of the new { @code String } is a function of the charset , and hence
* may not be equal to the length of the byte array .
*
* < p > The behavior of this constructor when the given bytes are not valid
* in the given charset is unspecified . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @param charsetName
* The name of a supported { @linkplain java . nio . charset . Charset
* charset }
*
* @throws UnsupportedEncodingException
* If the named charset is not supported
*
* @since JDK1 . 1
* /
public String ( byte bytes [ ] , String charsetName )
2012-05-17 10:06:19 -07:00
throws UnsupportedEncodingException {
2007-12-01 00:00:00 +00:00
this ( bytes , 0 , bytes . length , charsetName ) ;
}
/ * *
* Constructs a new { @code String } by decoding the specified array of
* bytes using the specified { @linkplain java . nio . charset . Charset charset } .
* The length of the new { @code String } is a function of the charset , and
* hence may not be equal to the length of the byte array .
*
* < p > This method always replaces malformed - input and unmappable - character
* sequences with this charset ' s default replacement string . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @param charset
* The { @linkplain java . nio . charset . Charset charset } to be used to
* decode the { @code bytes }
*
* @since 1 . 6
* /
public String ( byte bytes [ ] , Charset charset ) {
this ( bytes , 0 , bytes . length , charset ) ;
}
/ * *
* Constructs a new { @code String } by decoding the specified subarray of
* bytes using the platform ' s default charset . The length of the new
* { @code String } is a function of the charset , and hence may not be equal
* to the length of the subarray .
*
* < p > The behavior of this constructor when the given bytes are not valid
* in the default charset is unspecified . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @param offset
* The index of the first byte to decode
*
* @param length
* The number of bytes to decode
*
* @throws IndexOutOfBoundsException
* If the { @code offset } and the { @code length } arguments index
* characters outside the bounds of the { @code bytes } array
*
* @since JDK1 . 1
* /
public String ( byte bytes [ ] , int offset , int length ) {
checkBounds ( bytes , offset , length ) ;
2012-05-17 10:06:19 -07:00
this . value = StringCoding . decode ( bytes , offset , length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Constructs a new { @code String } by decoding the specified array of bytes
* using the platform ' s default charset . The length of the new { @code
* String } is a function of the charset , and hence may not be equal to the
* length of the byte array .
*
* < p > The behavior of this constructor when the given bytes are not valid
* in the default charset is unspecified . The { @link
* java . nio . charset . CharsetDecoder } class should be used when more control
* over the decoding process is required .
*
* @param bytes
* The bytes to be decoded into characters
*
* @since JDK1 . 1
* /
public String ( byte bytes [ ] ) {
this ( bytes , 0 , bytes . length ) ;
}
/ * *
* Allocates a new string that contains the sequence of characters
* currently contained in the string buffer argument . The contents of the
* string buffer are copied ; subsequent modification of the string buffer
* does not affect the newly created string .
*
* @param buffer
* A { @code StringBuffer }
* /
public String ( StringBuffer buffer ) {
2012-05-17 10:06:19 -07:00
synchronized ( buffer ) {
this . value = Arrays . copyOf ( buffer . getValue ( ) , buffer . length ( ) ) ;
}
2007-12-01 00:00:00 +00:00
}
/ * *
* Allocates a new string that contains the sequence of characters
* currently contained in the string builder argument . The contents of the
* string builder are copied ; subsequent modification of the string builder
* does not affect the newly created string .
*
* < p > This constructor is provided to ease migration to { @code
* StringBuilder } . Obtaining a string from a string builder via the { @code
* toString } method is likely to run faster and is generally preferred .
*
* @param builder
* A { @code StringBuilder }
*
* @since 1 . 5
* /
public String ( StringBuilder builder ) {
2012-05-17 10:06:19 -07:00
this . value = Arrays . copyOf ( builder . getValue ( ) , builder . length ( ) ) ;
2007-12-01 00:00:00 +00:00
}
2012-05-17 10:06:19 -07:00
/ *
* Package private constructor which shares value array for speed .
* this constructor is always expected to be called with share = = true .
* a separate constructor is needed because we already have a public
* String ( char [ ] ) constructor that makes a copy of the given char [ ] .
* /
String ( char [ ] value , boolean share ) {
// assert share : "unshared not supported";
2007-12-01 00:00:00 +00:00
this . value = value ;
}
/ * *
* Returns the length of this string .
* The length is equal to the number of < a href = " Character.html#unicode " > Unicode
* code units < / a > in the string .
*
* @return the length of the sequence of characters represented by this
* object .
* /
public int length ( ) {
2012-05-17 10:06:19 -07:00
return value . length ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-12-28 16:56:54 -05:00
* Returns { @code true } if , and only if , { @link # length ( ) } is { @code 0 } .
2007-12-01 00:00:00 +00:00
*
2012-12-28 16:56:54 -05:00
* @return { @code true } if { @link # length ( ) } is { @code 0 } , otherwise
* { @code false }
2007-12-01 00:00:00 +00:00
*
* @since 1 . 6
* /
public boolean isEmpty ( ) {
2012-05-17 10:06:19 -07:00
return value . length = = 0 ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the { @code char } value at the
* specified index . An index ranges from { @code 0 } to
* { @code length ( ) - 1 } . The first { @code char } value of the sequence
* is at index { @code 0 } , the next at index { @code 1 } ,
2007-12-01 00:00:00 +00:00
* and so on , as for array indexing .
*
2012-01-23 12:17:30 -08:00
* < p > If the { @code char } value specified by the index is a
2007-12-01 00:00:00 +00:00
* < a href = " Character.html#unicode " > surrogate < / a > , the surrogate
* value is returned .
*
2012-01-23 12:17:30 -08:00
* @param index the index of the { @code char } value .
* @return the { @code char } value at the specified index of this string .
* The first { @code char } value is at index { @code 0 } .
* @exception IndexOutOfBoundsException if the { @code index }
2007-12-01 00:00:00 +00:00
* argument is negative or not less than the length of this
* string .
* /
public char charAt ( int index ) {
2012-05-17 10:06:19 -07:00
if ( ( index < 0 ) | | ( index > = value . length ) ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( index ) ;
}
2012-05-17 10:06:19 -07:00
return value [ index ] ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns the character ( Unicode code point ) at the specified
2012-01-23 12:17:30 -08:00
* index . The index refers to { @code char } values
* ( Unicode code units ) and ranges from { @code 0 } to
* { @link # length ( ) } { @code - 1 } .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* < p > If the { @code char } value specified at the given index
2007-12-01 00:00:00 +00:00
* is in the high - surrogate range , the following index is less
2012-01-23 12:17:30 -08:00
* than the length of this { @code String } , and the
* { @code char } value at the following index is in the
2007-12-01 00:00:00 +00:00
* low - surrogate range , then the supplementary code point
* corresponding to this surrogate pair is returned . Otherwise ,
2012-01-23 12:17:30 -08:00
* the { @code char } value at the given index is returned .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param index the index to the { @code char } values
2007-12-01 00:00:00 +00:00
* @return the code point value of the character at the
2012-01-23 12:17:30 -08:00
* { @code index }
* @exception IndexOutOfBoundsException if the { @code index }
2007-12-01 00:00:00 +00:00
* argument is negative or not less than the length of this
* string .
* @since 1 . 5
* /
public int codePointAt ( int index ) {
2012-05-17 10:06:19 -07:00
if ( ( index < 0 ) | | ( index > = value . length ) ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( index ) ;
}
2012-05-17 10:06:19 -07:00
return Character . codePointAtImpl ( value , index , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns the character ( Unicode code point ) before the specified
2012-01-23 12:17:30 -08:00
* index . The index refers to { @code char } values
* ( Unicode code units ) and ranges from { @code 1 } to { @link
2007-12-01 00:00:00 +00:00
* CharSequence # length ( ) length } .
*
2012-01-23 12:17:30 -08:00
* < p > If the { @code char } value at { @code ( index - 1 ) }
* is in the low - surrogate range , { @code ( index - 2 ) } is not
* negative , and the { @code char } value at { @code ( index -
* 2 ) } is in the high - surrogate range , then the
2007-12-01 00:00:00 +00:00
* supplementary code point value of the surrogate pair is
2012-01-23 12:17:30 -08:00
* returned . If the { @code char } value at { @code index -
* 1 } is an unpaired low - surrogate or a high - surrogate , the
2007-12-01 00:00:00 +00:00
* surrogate value is returned .
*
* @param index the index following the code point that should be returned
* @return the Unicode code point value before the given index .
2012-01-23 12:17:30 -08:00
* @exception IndexOutOfBoundsException if the { @code index }
2007-12-01 00:00:00 +00:00
* argument is less than 1 or greater than the length
* of this string .
* @since 1 . 5
* /
public int codePointBefore ( int index ) {
int i = index - 1 ;
2012-05-17 10:06:19 -07:00
if ( ( i < 0 ) | | ( i > = value . length ) ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( index ) ;
}
2012-05-17 10:06:19 -07:00
return Character . codePointBeforeImpl ( value , index , 0 ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns the number of Unicode code points in the specified text
2012-01-23 12:17:30 -08:00
* range of this { @code String } . The text range begins at the
* specified { @code beginIndex } and extends to the
* { @code char } at index { @code endIndex - 1 } . Thus the
* length ( in { @code char } s ) of the text range is
* { @code endIndex - beginIndex } . Unpaired surrogates within
2007-12-01 00:00:00 +00:00
* the text range count as one code point each .
*
2012-01-23 12:17:30 -08:00
* @param beginIndex the index to the first { @code char } of
2007-12-01 00:00:00 +00:00
* the text range .
2012-01-23 12:17:30 -08:00
* @param endIndex the index after the last { @code char } of
2007-12-01 00:00:00 +00:00
* the text range .
* @return the number of Unicode code points in the specified text
* range
* @exception IndexOutOfBoundsException if the
2012-01-23 12:17:30 -08:00
* { @code beginIndex } is negative , or { @code endIndex }
* is larger than the length of this { @code String } , or
* { @code beginIndex } is larger than { @code endIndex } .
2007-12-01 00:00:00 +00:00
* @since 1 . 5
* /
public int codePointCount ( int beginIndex , int endIndex ) {
2012-05-17 10:06:19 -07:00
if ( beginIndex < 0 | | endIndex > value . length | | beginIndex > endIndex ) {
2007-12-01 00:00:00 +00:00
throw new IndexOutOfBoundsException ( ) ;
}
2012-05-17 10:06:19 -07:00
return Character . codePointCountImpl ( value , beginIndex , endIndex - beginIndex ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the index within this { @code String } that is
* offset from the given { @code index } by
* { @code codePointOffset } code points . Unpaired surrogates
* within the text range given by { @code index } and
* { @code codePointOffset } count as one code point each .
2007-12-01 00:00:00 +00:00
*
* @param index the index to be offset
* @param codePointOffset the offset in code points
2012-01-23 12:17:30 -08:00
* @return the index within this { @code String }
* @exception IndexOutOfBoundsException if { @code index }
2007-12-01 00:00:00 +00:00
* is negative or larger then the length of this
2012-01-23 12:17:30 -08:00
* { @code String } , or if { @code codePointOffset } is positive
* and the substring starting with { @code index } has fewer
* than { @code codePointOffset } code points ,
* or if { @code codePointOffset } is negative and the substring
* before { @code index } has fewer than the absolute value
* of { @code codePointOffset } code points .
2007-12-01 00:00:00 +00:00
* @since 1 . 5
* /
public int offsetByCodePoints ( int index , int codePointOffset ) {
2012-05-17 10:06:19 -07:00
if ( index < 0 | | index > value . length ) {
2007-12-01 00:00:00 +00:00
throw new IndexOutOfBoundsException ( ) ;
}
2012-05-17 10:06:19 -07:00
return Character . offsetByCodePointsImpl ( value , 0 , value . length ,
index , codePointOffset ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Copy characters from this string into dst starting at dstBegin .
* This method doesn ' t perform any range checking .
* /
void getChars ( char dst [ ] , int dstBegin ) {
2012-05-17 10:06:19 -07:00
System . arraycopy ( value , 0 , dst , dstBegin , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Copies characters from this string into the destination character
* array .
* < p >
2012-01-23 12:17:30 -08:00
* The first character to be copied is at index { @code srcBegin } ;
* the last character to be copied is at index { @code srcEnd - 1 }
2007-12-01 00:00:00 +00:00
* ( thus the total number of characters to be copied is
2012-01-23 12:17:30 -08:00
* { @code srcEnd - srcBegin } ) . The characters are copied into the
* subarray of { @code dst } starting at index { @code dstBegin }
2007-12-01 00:00:00 +00:00
* and ending at index :
* < p > < blockquote > < pre >
* dstbegin + ( srcEnd - srcBegin ) - 1
* < / pre > < / blockquote >
*
* @param srcBegin index of the first character in the string
* to copy .
* @param srcEnd index after the last character in the string
* to copy .
* @param dst the destination array .
* @param dstBegin the start offset in the destination array .
* @exception IndexOutOfBoundsException If any of the following
* is true :
2012-01-23 12:17:30 -08:00
* < ul > < li > { @code srcBegin } is negative .
* < li > { @code srcBegin } is greater than { @code srcEnd }
* < li > { @code srcEnd } is greater than the length of this
2007-12-01 00:00:00 +00:00
* string
2012-01-23 12:17:30 -08:00
* < li > { @code dstBegin } is negative
* < li > { @code dstBegin + ( srcEnd - srcBegin ) } is larger than
* { @code dst . length } < / ul >
2007-12-01 00:00:00 +00:00
* /
public void getChars ( int srcBegin , int srcEnd , char dst [ ] , int dstBegin ) {
if ( srcBegin < 0 ) {
throw new StringIndexOutOfBoundsException ( srcBegin ) ;
}
2012-05-17 10:06:19 -07:00
if ( srcEnd > value . length ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( srcEnd ) ;
}
if ( srcBegin > srcEnd ) {
throw new StringIndexOutOfBoundsException ( srcEnd - srcBegin ) ;
}
2012-05-17 10:06:19 -07:00
System . arraycopy ( value , srcBegin , dst , dstBegin , srcEnd - srcBegin ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Copies characters from this string into the destination byte array . Each
* byte receives the 8 low - order bits of the corresponding character . The
* eight high - order bits of each character are not copied and do not
* participate in the transfer in any way .
*
* < p > The first character to be copied is at index { @code srcBegin } ; the
* last character to be copied is at index { @code srcEnd - 1 } . The total
* number of characters to be copied is { @code srcEnd - srcBegin } . The
* characters , converted to bytes , are copied into the subarray of { @code
* dst } starting at index { @code dstBegin } and ending at index :
*
* < blockquote > < pre >
* dstbegin + ( srcEnd - srcBegin ) - 1
* < / pre > < / blockquote >
*
* @deprecated This method does not properly convert characters into
* bytes . As of JDK & nbsp ; 1 . 1 , the preferred way to do this is via the
* { @link # getBytes ( ) } method , which uses the platform ' s default charset .
*
* @param srcBegin
* Index of the first character in the string to copy
*
* @param srcEnd
* Index after the last character in the string to copy
*
* @param dst
* The destination array
*
* @param dstBegin
* The start offset in the destination array
*
* @throws IndexOutOfBoundsException
* If any of the following is true :
* < ul >
* < li > { @code srcBegin } is negative
* < li > { @code srcBegin } is greater than { @code srcEnd }
* < li > { @code srcEnd } is greater than the length of this String
* < li > { @code dstBegin } is negative
* < li > { @code dstBegin + ( srcEnd - srcBegin ) } is larger than { @code
* dst . length }
* < / ul >
* /
@Deprecated
public void getBytes ( int srcBegin , int srcEnd , byte dst [ ] , int dstBegin ) {
if ( srcBegin < 0 ) {
throw new StringIndexOutOfBoundsException ( srcBegin ) ;
}
2012-05-17 10:06:19 -07:00
if ( srcEnd > value . length ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( srcEnd ) ;
}
if ( srcBegin > srcEnd ) {
throw new StringIndexOutOfBoundsException ( srcEnd - srcBegin ) ;
}
2013-01-22 11:14:13 -05:00
Objects . requireNonNull ( dst ) ;
2007-12-01 00:00:00 +00:00
int j = dstBegin ;
2012-05-17 10:06:19 -07:00
int n = srcEnd ;
int i = srcBegin ;
2007-12-01 00:00:00 +00:00
char [ ] val = value ; /* avoid getfield opcode */
while ( i < n ) {
dst [ j + + ] = ( byte ) val [ i + + ] ;
}
}
/ * *
* Encodes this { @code String } into a sequence of bytes using the named
* charset , storing the result into a new byte array .
*
* < p > The behavior of this method when this string cannot be encoded in
* the given charset is unspecified . The { @link
* java . nio . charset . CharsetEncoder } class should be used when more control
* over the encoding process is required .
*
* @param charsetName
* The name of a supported { @linkplain java . nio . charset . Charset
* charset }
*
* @return The resultant byte array
*
* @throws UnsupportedEncodingException
* If the named charset is not supported
*
* @since JDK1 . 1
* /
public byte [ ] getBytes ( String charsetName )
2012-05-17 10:06:19 -07:00
throws UnsupportedEncodingException {
2007-12-01 00:00:00 +00:00
if ( charsetName = = null ) throw new NullPointerException ( ) ;
2012-05-17 10:06:19 -07:00
return StringCoding . encode ( charsetName , value , 0 , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Encodes this { @code String } into a sequence of bytes using the given
* { @linkplain java . nio . charset . Charset charset } , storing the result into a
* new byte array .
*
* < p > This method always replaces malformed - input and unmappable - character
* sequences with this charset ' s default replacement byte array . The
* { @link java . nio . charset . CharsetEncoder } class should be used when more
* control over the encoding process is required .
*
* @param charset
* The { @linkplain java . nio . charset . Charset } to be used to encode
* the { @code String }
*
* @return The resultant byte array
*
* @since 1 . 6
* /
public byte [ ] getBytes ( Charset charset ) {
if ( charset = = null ) throw new NullPointerException ( ) ;
2012-05-17 10:06:19 -07:00
return StringCoding . encode ( charset , value , 0 , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Encodes this { @code String } into a sequence of bytes using the
* platform ' s default charset , storing the result into a new byte array .
*
* < p > The behavior of this method when this string cannot be encoded in
* the default charset is unspecified . The { @link
* java . nio . charset . CharsetEncoder } class should be used when more control
* over the encoding process is required .
*
* @return The resultant byte array
*
* @since JDK1 . 1
* /
public byte [ ] getBytes ( ) {
2012-05-17 10:06:19 -07:00
return StringCoding . encode ( value , 0 , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Compares this string to the specified object . The result is { @code
* true } if and only if the argument is not { @code null } and is a { @code
* String } object that represents the same sequence of characters as this
* object .
*
* @param anObject
* The object to compare this { @code String } against
*
* @return { @code true } if the given object represents a { @code String }
* equivalent to this string , { @code false } otherwise
*
* @see # compareTo ( String )
* @see # equalsIgnoreCase ( String )
* /
public boolean equals ( Object anObject ) {
if ( this = = anObject ) {
return true ;
}
if ( anObject instanceof String ) {
2013-04-02 18:41:04 -04:00
String anotherString = ( String ) anObject ;
2012-05-17 10:06:19 -07:00
int n = value . length ;
if ( n = = anotherString . value . length ) {
2007-12-01 00:00:00 +00:00
char v1 [ ] = value ;
char v2 [ ] = anotherString . value ;
2012-05-17 10:06:19 -07:00
int i = 0 ;
2007-12-01 00:00:00 +00:00
while ( n - - ! = 0 ) {
2012-05-17 10:06:19 -07:00
if ( v1 [ i ] ! = v2 [ i ] )
2013-04-02 18:41:04 -04:00
return false ;
2012-05-17 10:06:19 -07:00
i + + ;
2007-12-01 00:00:00 +00:00
}
return true ;
}
}
return false ;
}
/ * *
* Compares this string to the specified { @code StringBuffer } . The result
* is { @code true } if and only if this { @code String } represents the same
2012-07-27 16:17:11 -04:00
* sequence of characters as the specified { @code StringBuffer } . This method
* synchronizes on the { @code StringBuffer } .
2007-12-01 00:00:00 +00:00
*
* @param sb
* The { @code StringBuffer } to compare this { @code String } against
*
* @return { @code true } if this { @code String } represents the same
* sequence of characters as the specified { @code StringBuffer } ,
* { @code false } otherwise
*
* @since 1 . 4
* /
public boolean contentEquals ( StringBuffer sb ) {
2013-04-02 18:41:04 -04:00
return contentEquals ( ( CharSequence ) sb ) ;
2012-07-27 16:17:11 -04:00
}
private boolean nonSyncContentEquals ( AbstractStringBuilder sb ) {
char v1 [ ] = value ;
char v2 [ ] = sb . getValue ( ) ;
2013-05-17 14:41:39 +02:00
int n = v1 . length ;
if ( n ! = sb . length ( ) ) {
return false ;
}
for ( int i = 0 ; i < n ; i + + ) {
2012-07-27 16:17:11 -04:00
if ( v1 [ i ] ! = v2 [ i ] ) {
return false ;
}
2007-12-01 00:00:00 +00:00
}
2012-07-27 16:17:11 -04:00
return true ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-07-27 16:17:11 -04:00
* Compares this string to the specified { @code CharSequence } . The
* result is { @code true } if and only if this { @code String } represents the
* same sequence of char values as the specified sequence . Note that if the
* { @code CharSequence } is a { @code StringBuffer } then the method
* synchronizes on it .
2007-12-01 00:00:00 +00:00
*
* @param cs
* The sequence to compare this { @code String } against
*
* @return { @code true } if this { @code String } represents the same
* sequence of char values as the specified sequence , { @code
* false } otherwise
*
* @since 1 . 5
* /
public boolean contentEquals ( CharSequence cs ) {
// Argument is a StringBuffer, StringBuilder
if ( cs instanceof AbstractStringBuilder ) {
2012-07-27 16:17:11 -04:00
if ( cs instanceof StringBuffer ) {
synchronized ( cs ) {
return nonSyncContentEquals ( ( AbstractStringBuilder ) cs ) ;
}
} else {
return nonSyncContentEquals ( ( AbstractStringBuilder ) cs ) ;
2007-12-01 00:00:00 +00:00
}
}
// Argument is a String
if ( cs . equals ( this ) )
return true ;
// Argument is a generic CharSequence
char v1 [ ] = value ;
2013-05-17 14:41:39 +02:00
int n = v1 . length ;
if ( n ! = cs . length ( ) ) {
return false ;
}
for ( int i = 0 ; i < n ; i + + ) {
if ( v1 [ i ] ! = cs . charAt ( i ) ) {
2007-12-01 00:00:00 +00:00
return false ;
2013-05-17 14:41:39 +02:00
}
2007-12-01 00:00:00 +00:00
}
return true ;
}
/ * *
* Compares this { @code String } to another { @code String } , ignoring case
* considerations . Two strings are considered equal ignoring case if they
* are of the same length and corresponding characters in the two strings
* are equal ignoring case .
*
* < p > Two characters { @code c1 } and { @code c2 } are considered the same
* ignoring case if at least one of the following is true :
* < ul >
* < li > The two characters are the same ( as compared by the
* { @code = = } operator )
* < li > Applying the method { @link
* java . lang . Character # toUpperCase ( char ) } to each character
* produces the same result
* < li > Applying the method { @link
* java . lang . Character # toLowerCase ( char ) } to each character
* produces the same result
* < / ul >
*
* @param anotherString
* The { @code String } to compare this { @code String } against
*
* @return { @code true } if the argument is not { @code null } and it
* represents an equivalent { @code String } ignoring case ; { @code
* false } otherwise
*
* @see # equals ( Object )
* /
public boolean equalsIgnoreCase ( String anotherString ) {
2012-05-17 10:06:19 -07:00
return ( this = = anotherString ) ? true
: ( anotherString ! = null )
& & ( anotherString . value . length = = value . length )
& & regionMatches ( true , 0 , anotherString , 0 , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Compares two strings lexicographically .
* The comparison is based on the Unicode value of each character in
* the strings . The character sequence represented by this
2012-01-23 12:17:30 -08:00
* { @code String } object is compared lexicographically to the
2007-12-01 00:00:00 +00:00
* character sequence represented by the argument string . The result is
2012-01-23 12:17:30 -08:00
* a negative integer if this { @code String } object
2007-12-01 00:00:00 +00:00
* lexicographically precedes the argument string . The result is a
2012-01-23 12:17:30 -08:00
* positive integer if this { @code String } object lexicographically
2007-12-01 00:00:00 +00:00
* follows the argument string . The result is zero if the strings
2012-01-23 12:17:30 -08:00
* are equal ; { @code compareTo } returns { @code 0 } exactly when
* the { @link # equals ( Object ) } method would return { @code true } .
2007-12-01 00:00:00 +00:00
* < p >
* This is the definition of lexicographic ordering . If two strings are
* different , then either they have different characters at some index
* that is a valid index for both strings , or their lengths are different ,
* or both . If they have different characters at one or more index
* positions , let < i > k < / i > be the smallest such index ; then the string
* whose character at position < i > k < / i > has the smaller value , as
* determined by using the & lt ; operator , lexicographically precedes the
2012-01-23 12:17:30 -08:00
* other string . In this case , { @code compareTo } returns the
* difference of the two character values at position { @code k } in
2007-12-01 00:00:00 +00:00
* the two string - - that is , the value :
* < blockquote > < pre >
* this . charAt ( k ) - anotherString . charAt ( k )
* < / pre > < / blockquote >
* If there is no index position at which they differ , then the shorter
* string lexicographically precedes the longer string . In this case ,
2012-01-23 12:17:30 -08:00
* { @code compareTo } returns the difference of the lengths of the
2007-12-01 00:00:00 +00:00
* strings - - that is , the value :
* < blockquote > < pre >
* this . length ( ) - anotherString . length ( )
* < / pre > < / blockquote >
*
2012-01-23 12:17:30 -08:00
* @param anotherString the { @code String } to be compared .
* @return the value { @code 0 } if the argument string is equal to
* this string ; a value less than { @code 0 } if this string
2007-12-01 00:00:00 +00:00
* is lexicographically less than the string argument ; and a
2012-01-23 12:17:30 -08:00
* value greater than { @code 0 } if this string is
2007-12-01 00:00:00 +00:00
* lexicographically greater than the string argument .
* /
public int compareTo ( String anotherString ) {
2012-05-17 10:06:19 -07:00
int len1 = value . length ;
int len2 = anotherString . value . length ;
int lim = Math . min ( len1 , len2 ) ;
2007-12-01 00:00:00 +00:00
char v1 [ ] = value ;
char v2 [ ] = anotherString . value ;
2012-05-17 10:06:19 -07:00
int k = 0 ;
while ( k < lim ) {
char c1 = v1 [ k ] ;
char c2 = v2 [ k ] ;
if ( c1 ! = c2 ) {
return c1 - c2 ;
2007-12-01 00:00:00 +00:00
}
2012-05-17 10:06:19 -07:00
k + + ;
2007-12-01 00:00:00 +00:00
}
return len1 - len2 ;
}
/ * *
2012-01-23 12:17:30 -08:00
* A Comparator that orders { @code String } objects as by
* { @code compareToIgnoreCase } . This comparator is serializable .
2007-12-01 00:00:00 +00:00
* < p >
* Note that this Comparator does < em > not < / em > take locale into account ,
* and will result in an unsatisfactory ordering for certain locales .
* The java . text package provides < em > Collators < / em > to allow
* locale - sensitive ordering .
*
* @see java . text . Collator # compare ( String , String )
* @since 1 . 2
* /
public static final Comparator < String > CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator ( ) ;
private static class CaseInsensitiveComparator
2012-05-17 10:06:19 -07:00
implements Comparator < String > , java . io . Serializable {
2007-12-01 00:00:00 +00:00
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L ;
public int compare ( String s1 , String s2 ) {
int n1 = s1 . length ( ) ;
int n2 = s2 . length ( ) ;
int min = Math . min ( n1 , n2 ) ;
for ( int i = 0 ; i < min ; i + + ) {
char c1 = s1 . charAt ( i ) ;
char c2 = s2 . charAt ( i ) ;
if ( c1 ! = c2 ) {
c1 = Character . toUpperCase ( c1 ) ;
c2 = Character . toUpperCase ( c2 ) ;
if ( c1 ! = c2 ) {
c1 = Character . toLowerCase ( c1 ) ;
c2 = Character . toLowerCase ( c2 ) ;
if ( c1 ! = c2 ) {
// No overflow because of numeric promotion
return c1 - c2 ;
}
}
}
}
return n1 - n2 ;
}
2011-12-02 16:25:35 -08:00
/** Replaces the de-serialized object. */
private Object readResolve ( ) { return CASE_INSENSITIVE_ORDER ; }
2007-12-01 00:00:00 +00:00
}
/ * *
* Compares two strings lexicographically , ignoring case
* differences . This method returns an integer whose sign is that of
2012-01-23 12:17:30 -08:00
* calling { @code compareTo } with normalized versions of the strings
2007-12-01 00:00:00 +00:00
* where case differences have been eliminated by calling
2012-01-23 12:17:30 -08:00
* { @code Character . toLowerCase ( Character . toUpperCase ( character ) ) } on
2007-12-01 00:00:00 +00:00
* each character .
* < p >
* Note that this method does < em > not < / em > take locale into account ,
* and will result in an unsatisfactory ordering for certain locales .
* The java . text package provides < em > collators < / em > to allow
* locale - sensitive ordering .
*
2012-01-23 12:17:30 -08:00
* @param str the { @code String } to be compared .
2007-12-01 00:00:00 +00:00
* @return a negative integer , zero , or a positive integer as the
* specified String is greater than , equal to , or less
* than this String , ignoring case considerations .
* @see java . text . Collator # compare ( String , String )
* @since 1 . 2
* /
public int compareToIgnoreCase ( String str ) {
return CASE_INSENSITIVE_ORDER . compare ( this , str ) ;
}
/ * *
* Tests if two string regions are equal .
* < p >
2012-12-28 16:56:54 -05:00
* A substring of this { @code String } object is compared to a substring
2007-12-01 00:00:00 +00:00
* of the argument other . The result is true if these substrings
* represent identical character sequences . The substring of this
2012-12-28 16:56:54 -05:00
* { @code String } object to be compared begins at index { @code toffset }
* and has length { @code len } . The substring of other to be compared
* begins at index { @code ooffset } and has length { @code len } . The
* result is { @code false } if and only if at least one of the following
2007-12-01 00:00:00 +00:00
* is true :
2012-12-28 16:56:54 -05:00
* < ul > < li > { @code toffset } is negative .
* < li > { @code ooffset } is negative .
* < li > { @code toffset + len } is greater than the length of this
* { @code String } object .
* < li > { @code ooffset + len } is greater than the length of the other
2007-12-01 00:00:00 +00:00
* argument .
2012-12-28 16:56:54 -05:00
* < li > There is some nonnegative integer < i > k < / i > less than { @code len }
2007-12-01 00:00:00 +00:00
* such that :
2013-04-02 18:41:04 -04:00
* { @code this . charAt ( toffset + } < i > k < / i > { @code ) ! = other . charAt ( ooffset + }
* < i > k < / i > { @code ) }
2007-12-01 00:00:00 +00:00
* < / ul >
*
* @param toffset the starting offset of the subregion in this string .
* @param other the string argument .
* @param ooffset the starting offset of the subregion in the string
* argument .
* @param len the number of characters to compare .
2012-01-23 12:17:30 -08:00
* @return { @code true } if the specified subregion of this string
2007-12-01 00:00:00 +00:00
* exactly matches the specified subregion of the string argument ;
2012-01-23 12:17:30 -08:00
* { @code false } otherwise .
2007-12-01 00:00:00 +00:00
* /
public boolean regionMatches ( int toffset , String other , int ooffset ,
2012-05-17 10:06:19 -07:00
int len ) {
2007-12-01 00:00:00 +00:00
char ta [ ] = value ;
2012-05-17 10:06:19 -07:00
int to = toffset ;
2007-12-01 00:00:00 +00:00
char pa [ ] = other . value ;
2012-05-17 10:06:19 -07:00
int po = ooffset ;
2007-12-01 00:00:00 +00:00
// Note: toffset, ooffset, or len might be near -1>>>1.
2012-05-17 10:06:19 -07:00
if ( ( ooffset < 0 ) | | ( toffset < 0 )
| | ( toffset > ( long ) value . length - len )
| | ( ooffset > ( long ) other . value . length - len ) ) {
2007-12-01 00:00:00 +00:00
return false ;
}
while ( len - - > 0 ) {
if ( ta [ to + + ] ! = pa [ po + + ] ) {
return false ;
}
}
return true ;
}
/ * *
* Tests if two string regions are equal .
* < p >
2012-12-28 16:56:54 -05:00
* A substring of this { @code String } object is compared to a substring
* of the argument { @code other } . The result is { @code true } if these
2007-12-01 00:00:00 +00:00
* substrings represent character sequences that are the same , ignoring
2012-12-28 16:56:54 -05:00
* case if and only if { @code ignoreCase } is true . The substring of
* this { @code String } object to be compared begins at index
* { @code toffset } and has length { @code len } . The substring of
* { @code other } to be compared begins at index { @code ooffset } and
* has length { @code len } . The result is { @code false } if and only if
2007-12-01 00:00:00 +00:00
* at least one of the following is true :
2012-12-28 16:56:54 -05:00
* < ul > < li > { @code toffset } is negative .
* < li > { @code ooffset } is negative .
* < li > { @code toffset + len } is greater than the length of this
* { @code String } object .
* < li > { @code ooffset + len } is greater than the length of the other
2007-12-01 00:00:00 +00:00
* argument .
2012-12-28 16:56:54 -05:00
* < li > { @code ignoreCase } is { @code false } and there is some nonnegative
* integer < i > k < / i > less than { @code len } such that :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
* this . charAt ( toffset + k ) ! = other . charAt ( ooffset + k )
* < / pre > < / blockquote >
2012-12-28 16:56:54 -05:00
* < li > { @code ignoreCase } is { @code true } and there is some nonnegative
* integer < i > k < / i > less than { @code len } such that :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
* Character . toLowerCase ( this . charAt ( toffset + k ) ) ! =
2012-05-17 10:06:19 -07:00
Character . toLowerCase ( other . charAt ( ooffset + k ) )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
* and :
* < blockquote > < pre >
* Character . toUpperCase ( this . charAt ( toffset + k ) ) ! =
* Character . toUpperCase ( other . charAt ( ooffset + k ) )
* < / pre > < / blockquote >
* < / ul >
*
2012-01-23 12:17:30 -08:00
* @param ignoreCase if { @code true } , ignore case when comparing
2007-12-01 00:00:00 +00:00
* characters .
* @param toffset the starting offset of the subregion in this
* string .
* @param other the string argument .
* @param ooffset the starting offset of the subregion in the string
* argument .
* @param len the number of characters to compare .
2012-01-23 12:17:30 -08:00
* @return { @code true } if the specified subregion of this string
2007-12-01 00:00:00 +00:00
* matches the specified subregion of the string argument ;
2012-01-23 12:17:30 -08:00
* { @code false } otherwise . Whether the matching is exact
* or case insensitive depends on the { @code ignoreCase }
2007-12-01 00:00:00 +00:00
* argument .
* /
public boolean regionMatches ( boolean ignoreCase , int toffset ,
2012-05-17 10:06:19 -07:00
String other , int ooffset , int len ) {
2007-12-01 00:00:00 +00:00
char ta [ ] = value ;
2012-05-17 10:06:19 -07:00
int to = toffset ;
2007-12-01 00:00:00 +00:00
char pa [ ] = other . value ;
2012-05-17 10:06:19 -07:00
int po = ooffset ;
2007-12-01 00:00:00 +00:00
// Note: toffset, ooffset, or len might be near -1>>>1.
2012-05-17 10:06:19 -07:00
if ( ( ooffset < 0 ) | | ( toffset < 0 )
| | ( toffset > ( long ) value . length - len )
| | ( ooffset > ( long ) other . value . length - len ) ) {
2007-12-01 00:00:00 +00:00
return false ;
}
while ( len - - > 0 ) {
char c1 = ta [ to + + ] ;
char c2 = pa [ po + + ] ;
if ( c1 = = c2 ) {
continue ;
}
if ( ignoreCase ) {
// If characters don't match but case may be ignored,
// try converting both characters to uppercase.
// If the results match, then the comparison scan should
// continue.
char u1 = Character . toUpperCase ( c1 ) ;
char u2 = Character . toUpperCase ( c2 ) ;
if ( u1 = = u2 ) {
continue ;
}
// Unfortunately, conversion to uppercase does not work properly
// for the Georgian alphabet, which has strange rules about case
// conversion. So we need to make one last check before
// exiting.
if ( Character . toLowerCase ( u1 ) = = Character . toLowerCase ( u2 ) ) {
continue ;
}
}
return false ;
}
return true ;
}
/ * *
* Tests if the substring of this string beginning at the
* specified index starts with the specified prefix .
*
* @param prefix the prefix .
* @param toffset where to begin looking in this string .
2012-01-23 12:17:30 -08:00
* @return { @code true } if the character sequence represented by the
2007-12-01 00:00:00 +00:00
* argument is a prefix of the substring of this object starting
2012-01-23 12:17:30 -08:00
* at index { @code toffset } ; { @code false } otherwise .
* The result is { @code false } if { @code toffset } is
2007-12-01 00:00:00 +00:00
* negative or greater than the length of this
2012-01-23 12:17:30 -08:00
* { @code String } object ; otherwise the result is the same
2007-12-01 00:00:00 +00:00
* as the result of the expression
* < pre >
* this . substring ( toffset ) . startsWith ( prefix )
* < / pre >
* /
public boolean startsWith ( String prefix , int toffset ) {
char ta [ ] = value ;
2012-05-17 10:06:19 -07:00
int to = toffset ;
2007-12-01 00:00:00 +00:00
char pa [ ] = prefix . value ;
2012-05-17 10:06:19 -07:00
int po = 0 ;
int pc = prefix . value . length ;
2007-12-01 00:00:00 +00:00
// Note: toffset might be near -1>>>1.
2012-05-17 10:06:19 -07:00
if ( ( toffset < 0 ) | | ( toffset > value . length - pc ) ) {
2007-12-01 00:00:00 +00:00
return false ;
}
while ( - - pc > = 0 ) {
if ( ta [ to + + ] ! = pa [ po + + ] ) {
return false ;
}
}
return true ;
}
/ * *
* Tests if this string starts with the specified prefix .
*
* @param prefix the prefix .
2012-01-23 12:17:30 -08:00
* @return { @code true } if the character sequence represented by the
2007-12-01 00:00:00 +00:00
* argument is a prefix of the character sequence represented by
2012-01-23 12:17:30 -08:00
* this string ; { @code false } otherwise .
* Note also that { @code true } will be returned if the
2007-12-01 00:00:00 +00:00
* argument is an empty string or is equal to this
2012-01-23 12:17:30 -08:00
* { @code String } object as determined by the
2007-12-01 00:00:00 +00:00
* { @link # equals ( Object ) } method .
* @since 1 . 0
* /
public boolean startsWith ( String prefix ) {
return startsWith ( prefix , 0 ) ;
}
/ * *
* Tests if this string ends with the specified suffix .
*
* @param suffix the suffix .
2012-01-23 12:17:30 -08:00
* @return { @code true } if the character sequence represented by the
2007-12-01 00:00:00 +00:00
* argument is a suffix of the character sequence represented by
2012-01-23 12:17:30 -08:00
* this object ; { @code false } otherwise . Note that the
* result will be { @code true } if the argument is the
* empty string or is equal to this { @code String } object
2007-12-01 00:00:00 +00:00
* as determined by the { @link # equals ( Object ) } method .
* /
public boolean endsWith ( String suffix ) {
2012-05-17 10:06:19 -07:00
return startsWith ( suffix , value . length - suffix . value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns a hash code for this string . The hash code for a
2012-01-23 12:17:30 -08:00
* { @code String } object is computed as
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
* s [ 0 ] * 31 ^ ( n - 1 ) + s [ 1 ] * 31 ^ ( n - 2 ) + . . . + s [ n - 1 ]
* < / pre > < / blockquote >
2012-01-23 12:17:30 -08:00
* using { @code int } arithmetic , where { @code s [ i ] } is the
* < i > i < / i > th character of the string , { @code n } is the length of
* the string , and { @code ^ } indicates exponentiation .
2007-12-01 00:00:00 +00:00
* ( The hash value of the empty string is zero . )
*
* @return a hash code value for this object .
* /
public int hashCode ( ) {
int h = hash ;
2012-05-17 10:06:19 -07:00
if ( h = = 0 & & value . length > 0 ) {
2007-12-01 00:00:00 +00:00
char val [ ] = value ;
2012-05-17 10:06:19 -07:00
for ( int i = 0 ; i < value . length ; i + + ) {
h = 31 * h + val [ i ] ;
2007-12-01 00:00:00 +00:00
}
hash = h ;
}
return h ;
}
/ * *
* Returns the index within this string of the first occurrence of
* the specified character . If a character with value
2012-01-23 12:17:30 -08:00
* { @code ch } occurs in the character sequence represented by
* this { @code String } object , then the index ( in Unicode
2007-12-01 00:00:00 +00:00
* code units ) of the first such occurrence is returned . For
2012-01-23 12:17:30 -08:00
* values of { @code ch } in the range from 0 to 0xFFFF
2007-12-01 00:00:00 +00:00
* ( inclusive ) , this is the smallest value < i > k < / i > such that :
* < blockquote > < pre >
* this . charAt ( < i > k < / i > ) = = ch
* < / pre > < / blockquote >
2012-01-23 12:17:30 -08:00
* is true . For other values of { @code ch } , it is the
2007-12-01 00:00:00 +00:00
* smallest value < i > k < / i > such that :
* < blockquote > < pre >
* this . codePointAt ( < i > k < / i > ) = = ch
* < / pre > < / blockquote >
* is true . In either case , if no such character occurs in this
2012-01-23 12:17:30 -08:00
* string , then { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
* @param ch a character ( Unicode code point ) .
* @return the index of the first occurrence of the character in the
* character sequence represented by this object , or
2012-01-23 12:17:30 -08:00
* { @code - 1 } if the character does not occur .
2007-12-01 00:00:00 +00:00
* /
public int indexOf ( int ch ) {
return indexOf ( ch , 0 ) ;
}
/ * *
* Returns the index within this string of the first occurrence of the
* specified character , starting the search at the specified index .
* < p >
2012-01-23 12:17:30 -08:00
* If a character with value { @code ch } occurs in the
* character sequence represented by this { @code String }
* object at an index no smaller than { @code fromIndex } , then
2007-12-01 00:00:00 +00:00
* the index of the first such occurrence is returned . For values
2012-01-23 12:17:30 -08:00
* of { @code ch } in the range from 0 to 0xFFFF ( inclusive ) ,
2007-12-01 00:00:00 +00:00
* this is the smallest value < i > k < / i > such that :
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* ( this . charAt ( < i > k < / i > ) = = ch ) { @code & & } ( < i > k < / i > & gt ; = fromIndex )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
2012-01-23 12:17:30 -08:00
* is true . For other values of { @code ch } , it is the
2007-12-01 00:00:00 +00:00
* smallest value < i > k < / i > such that :
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* ( this . codePointAt ( < i > k < / i > ) = = ch ) { @code & & } ( < i > k < / i > & gt ; = fromIndex )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
* is true . In either case , if no such character occurs in this
2012-01-23 12:17:30 -08:00
* string at or after position { @code fromIndex } , then
* { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
* < p >
2012-01-23 12:17:30 -08:00
* There is no restriction on the value of { @code fromIndex } . If it
2007-12-01 00:00:00 +00:00
* is negative , it has the same effect as if it were zero : this entire
* string may be searched . If it is greater than the length of this
* string , it has the same effect as if it were equal to the length of
2012-01-23 12:17:30 -08:00
* this string : { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* < p > All indices are specified in { @code char } values
2007-12-01 00:00:00 +00:00
* ( Unicode code units ) .
*
* @param ch a character ( Unicode code point ) .
* @param fromIndex the index to start the search from .
* @return the index of the first occurrence of the character in the
* character sequence represented by this object that is greater
2012-01-23 12:17:30 -08:00
* than or equal to { @code fromIndex } , or { @code - 1 }
2007-12-01 00:00:00 +00:00
* if the character does not occur .
* /
public int indexOf ( int ch , int fromIndex ) {
2012-05-17 10:06:19 -07:00
final int max = value . length ;
2007-12-01 00:00:00 +00:00
if ( fromIndex < 0 ) {
fromIndex = 0 ;
2012-05-17 10:06:19 -07:00
} else if ( fromIndex > = max ) {
2007-12-01 00:00:00 +00:00
// Note: fromIndex might be near -1>>>1.
return - 1 ;
}
if ( ch < Character . MIN_SUPPLEMENTARY_CODE_POINT ) {
// handle most cases here (ch is a BMP code point or a
// negative value (invalid code point))
2010-06-30 16:11:32 -07:00
final char [ ] value = this . value ;
2012-05-17 10:06:19 -07:00
for ( int i = fromIndex ; i < max ; i + + ) {
2010-06-30 16:11:32 -07:00
if ( value [ i ] = = ch ) {
2012-05-17 10:06:19 -07:00
return i ;
2007-12-01 00:00:00 +00:00
}
}
return - 1 ;
2010-06-30 16:11:32 -07:00
} else {
return indexOfSupplementary ( ch , fromIndex ) ;
2007-12-01 00:00:00 +00:00
}
2010-06-30 16:11:32 -07:00
}
2007-12-01 00:00:00 +00:00
2010-06-30 16:11:32 -07:00
/ * *
* Handles ( rare ) calls of indexOf with a supplementary character .
* /
private int indexOfSupplementary ( int ch , int fromIndex ) {
if ( Character . isValidCodePoint ( ch ) ) {
final char [ ] value = this . value ;
2010-06-30 16:11:32 -07:00
final char hi = Character . highSurrogate ( ch ) ;
final char lo = Character . lowSurrogate ( ch ) ;
2012-05-17 10:06:19 -07:00
final int max = value . length - 1 ;
for ( int i = fromIndex ; i < max ; i + + ) {
if ( value [ i ] = = hi & & value [ i + 1 ] = = lo ) {
return i ;
2007-12-01 00:00:00 +00:00
}
}
}
return - 1 ;
}
/ * *
* Returns the index within this string of the last occurrence of
2012-01-23 12:17:30 -08:00
* the specified character . For values of { @code ch } in the
2007-12-01 00:00:00 +00:00
* range from 0 to 0xFFFF ( inclusive ) , the index ( in Unicode code
* units ) returned is the largest value < i > k < / i > such that :
* < blockquote > < pre >
* this . charAt ( < i > k < / i > ) = = ch
* < / pre > < / blockquote >
2012-01-23 12:17:30 -08:00
* is true . For other values of { @code ch } , it is the
2007-12-01 00:00:00 +00:00
* largest value < i > k < / i > such that :
* < blockquote > < pre >
* this . codePointAt ( < i > k < / i > ) = = ch
* < / pre > < / blockquote >
* is true . In either case , if no such character occurs in this
2012-01-23 12:17:30 -08:00
* string , then { @code - 1 } is returned . The
* { @code String } is searched backwards starting at the last
2007-12-01 00:00:00 +00:00
* character .
*
* @param ch a character ( Unicode code point ) .
* @return the index of the last occurrence of the character in the
* character sequence represented by this object , or
2012-01-23 12:17:30 -08:00
* { @code - 1 } if the character does not occur .
2007-12-01 00:00:00 +00:00
* /
public int lastIndexOf ( int ch ) {
2012-05-17 10:06:19 -07:00
return lastIndexOf ( ch , value . length - 1 ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns the index within this string of the last occurrence of
* the specified character , searching backward starting at the
2012-01-23 12:17:30 -08:00
* specified index . For values of { @code ch } in the range
2007-12-01 00:00:00 +00:00
* from 0 to 0xFFFF ( inclusive ) , the index returned is the largest
* value < i > k < / i > such that :
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* ( this . charAt ( < i > k < / i > ) = = ch ) { @code & & } ( < i > k < / i > & lt ; = fromIndex )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
2012-01-23 12:17:30 -08:00
* is true . For other values of { @code ch } , it is the
2007-12-01 00:00:00 +00:00
* largest value < i > k < / i > such that :
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* ( this . codePointAt ( < i > k < / i > ) = = ch ) { @code & & } ( < i > k < / i > & lt ; = fromIndex )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
* is true . In either case , if no such character occurs in this
2012-01-23 12:17:30 -08:00
* string at or before position { @code fromIndex } , then
* { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* < p > All indices are specified in { @code char } values
2007-12-01 00:00:00 +00:00
* ( Unicode code units ) .
*
* @param ch a character ( Unicode code point ) .
* @param fromIndex the index to start the search from . There is no
2012-01-23 12:17:30 -08:00
* restriction on the value of { @code fromIndex } . If it is
2007-12-01 00:00:00 +00:00
* greater than or equal to the length of this string , it has
* the same effect as if it were equal to one less than the
* length of this string : this entire string may be searched .
* If it is negative , it has the same effect as if it were - 1 :
* - 1 is returned .
* @return the index of the last occurrence of the character in the
* character sequence represented by this object that is less
2012-01-23 12:17:30 -08:00
* than or equal to { @code fromIndex } , or { @code - 1 }
2007-12-01 00:00:00 +00:00
* if the character does not occur before that point .
* /
public int lastIndexOf ( int ch , int fromIndex ) {
if ( ch < Character . MIN_SUPPLEMENTARY_CODE_POINT ) {
// handle most cases here (ch is a BMP code point or a
// negative value (invalid code point))
2010-06-30 16:11:32 -07:00
final char [ ] value = this . value ;
2012-05-17 10:06:19 -07:00
int i = Math . min ( fromIndex , value . length - 1 ) ;
for ( ; i > = 0 ; i - - ) {
2010-06-30 16:11:32 -07:00
if ( value [ i ] = = ch ) {
2012-05-17 10:06:19 -07:00
return i ;
2007-12-01 00:00:00 +00:00
}
}
return - 1 ;
2010-06-30 16:11:32 -07:00
} else {
return lastIndexOfSupplementary ( ch , fromIndex ) ;
2007-12-01 00:00:00 +00:00
}
2010-06-30 16:11:32 -07:00
}
2007-12-01 00:00:00 +00:00
2010-06-30 16:11:32 -07:00
/ * *
* Handles ( rare ) calls of lastIndexOf with a supplementary character .
* /
private int lastIndexOfSupplementary ( int ch , int fromIndex ) {
if ( Character . isValidCodePoint ( ch ) ) {
final char [ ] value = this . value ;
2010-06-30 16:11:32 -07:00
char hi = Character . highSurrogate ( ch ) ;
char lo = Character . lowSurrogate ( ch ) ;
2012-05-17 10:06:19 -07:00
int i = Math . min ( fromIndex , value . length - 2 ) ;
for ( ; i > = 0 ; i - - ) {
if ( value [ i ] = = hi & & value [ i + 1 ] = = lo ) {
return i ;
2007-12-01 00:00:00 +00:00
}
}
}
return - 1 ;
}
/ * *
* Returns the index within this string of the first occurrence of the
2010-06-30 16:11:32 -07:00
* specified substring .
*
* < p > The returned index is the smallest value < i > k < / i > for which :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
* this . startsWith ( str , < i > k < / i > )
* < / pre > < / blockquote >
2010-06-30 16:11:32 -07:00
* If no such value of < i > k < / i > exists , then { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
2010-06-30 16:11:32 -07:00
* @param str the substring to search for .
* @return the index of the first occurrence of the specified substring ,
* or { @code - 1 } if there is no such occurrence .
2007-12-01 00:00:00 +00:00
* /
public int indexOf ( String str ) {
return indexOf ( str , 0 ) ;
}
/ * *
* Returns the index within this string of the first occurrence of the
2010-06-30 16:11:32 -07:00
* specified substring , starting at the specified index .
*
* < p > The returned index is the smallest value < i > k < / i > for which :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* < i > k < / i > & gt ; = fromIndex { @code & & } this . startsWith ( str , < i > k < / i > )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
2010-06-30 16:11:32 -07:00
* If no such value of < i > k < / i > exists , then { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
2010-06-30 16:11:32 -07:00
* @param str the substring to search for .
2007-12-01 00:00:00 +00:00
* @param fromIndex the index from which to start the search .
2010-06-30 16:11:32 -07:00
* @return the index of the first occurrence of the specified substring ,
* starting at the specified index ,
* or { @code - 1 } if there is no such occurrence .
2007-12-01 00:00:00 +00:00
* /
public int indexOf ( String str , int fromIndex ) {
2012-05-17 10:06:19 -07:00
return indexOf ( value , 0 , value . length ,
str . value , 0 , str . value . length , fromIndex ) ;
2007-12-01 00:00:00 +00:00
}
2012-11-29 14:09:45 -08:00
/ * *
* Code shared by String and AbstractStringBuilder to do searches . The
* source is the character array being searched , and the target
* is the string being searched for .
*
* @param source the characters being searched .
* @param sourceOffset offset of the source string .
* @param sourceCount count of the source string .
* @param target the characters being searched for .
* @param fromIndex the index to begin searching from .
* /
static int indexOf ( char [ ] source , int sourceOffset , int sourceCount ,
String target , int fromIndex ) {
return indexOf ( source , sourceOffset , sourceCount ,
target . value , 0 , target . value . length ,
fromIndex ) ;
}
2007-12-01 00:00:00 +00:00
/ * *
* Code shared by String and StringBuffer to do searches . The
* source is the character array being searched , and the target
* is the string being searched for .
*
* @param source the characters being searched .
* @param sourceOffset offset of the source string .
* @param sourceCount count of the source string .
* @param target the characters being searched for .
* @param targetOffset offset of the target string .
* @param targetCount count of the target string .
* @param fromIndex the index to begin searching from .
* /
static int indexOf ( char [ ] source , int sourceOffset , int sourceCount ,
2012-05-17 10:06:19 -07:00
char [ ] target , int targetOffset , int targetCount ,
int fromIndex ) {
2007-12-01 00:00:00 +00:00
if ( fromIndex > = sourceCount ) {
return ( targetCount = = 0 ? sourceCount : - 1 ) ;
}
if ( fromIndex < 0 ) {
fromIndex = 0 ;
}
if ( targetCount = = 0 ) {
return fromIndex ;
}
2012-05-17 10:06:19 -07:00
char first = target [ targetOffset ] ;
2007-12-01 00:00:00 +00:00
int max = sourceOffset + ( sourceCount - targetCount ) ;
for ( int i = sourceOffset + fromIndex ; i < = max ; i + + ) {
/* Look for first character. */
if ( source [ i ] ! = first ) {
while ( + + i < = max & & source [ i ] ! = first ) ;
}
/* Found first character, now look at the rest of v2 */
if ( i < = max ) {
int j = i + 1 ;
int end = j + targetCount - 1 ;
2012-05-17 10:06:19 -07:00
for ( int k = targetOffset + 1 ; j < end & & source [ j ]
= = target [ k ] ; j + + , k + + ) ;
2007-12-01 00:00:00 +00:00
if ( j = = end ) {
/* Found whole string. */
return i - sourceOffset ;
}
}
}
return - 1 ;
}
/ * *
2010-06-30 16:11:32 -07:00
* Returns the index within this string of the last occurrence of the
* specified substring . The last occurrence of the empty string " "
* is considered to occur at the index value { @code this . length ( ) } .
*
* < p > The returned index is the largest value < i > k < / i > for which :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
2010-06-30 16:11:32 -07:00
* this . startsWith ( str , < i > k < / i > )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
2010-06-30 16:11:32 -07:00
* If no such value of < i > k < / i > exists , then { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
* @param str the substring to search for .
2010-06-30 16:11:32 -07:00
* @return the index of the last occurrence of the specified substring ,
* or { @code - 1 } if there is no such occurrence .
2007-12-01 00:00:00 +00:00
* /
public int lastIndexOf ( String str ) {
2012-05-17 10:06:19 -07:00
return lastIndexOf ( str , value . length ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns the index within this string of the last occurrence of the
* specified substring , searching backward starting at the specified index .
2010-06-30 16:11:32 -07:00
*
* < p > The returned index is the largest value < i > k < / i > for which :
2007-12-01 00:00:00 +00:00
* < blockquote > < pre >
2012-12-28 16:56:54 -05:00
* < i > k < / i > { @code < = } fromIndex { @code & & } this . startsWith ( str , < i > k < / i > )
2007-12-01 00:00:00 +00:00
* < / pre > < / blockquote >
2010-06-30 16:11:32 -07:00
* If no such value of < i > k < / i > exists , then { @code - 1 } is returned .
2007-12-01 00:00:00 +00:00
*
* @param str the substring to search for .
* @param fromIndex the index to start the search from .
2010-06-30 16:11:32 -07:00
* @return the index of the last occurrence of the specified substring ,
* searching backward from the specified index ,
* or { @code - 1 } if there is no such occurrence .
2007-12-01 00:00:00 +00:00
* /
public int lastIndexOf ( String str , int fromIndex ) {
2012-05-17 10:06:19 -07:00
return lastIndexOf ( value , 0 , value . length ,
str . value , 0 , str . value . length , fromIndex ) ;
2007-12-01 00:00:00 +00:00
}
2012-11-29 14:09:45 -08:00
/ * *
* Code shared by String and AbstractStringBuilder to do searches . The
* source is the character array being searched , and the target
* is the string being searched for .
*
* @param source the characters being searched .
* @param sourceOffset offset of the source string .
* @param sourceCount count of the source string .
* @param target the characters being searched for .
* @param fromIndex the index to begin searching from .
* /
static int lastIndexOf ( char [ ] source , int sourceOffset , int sourceCount ,
String target , int fromIndex ) {
return lastIndexOf ( source , sourceOffset , sourceCount ,
target . value , 0 , target . value . length ,
fromIndex ) ;
}
2007-12-01 00:00:00 +00:00
/ * *
* Code shared by String and StringBuffer to do searches . The
* source is the character array being searched , and the target
* is the string being searched for .
*
* @param source the characters being searched .
* @param sourceOffset offset of the source string .
* @param sourceCount count of the source string .
* @param target the characters being searched for .
* @param targetOffset offset of the target string .
* @param targetCount count of the target string .
* @param fromIndex the index to begin searching from .
* /
static int lastIndexOf ( char [ ] source , int sourceOffset , int sourceCount ,
2012-05-17 10:06:19 -07:00
char [ ] target , int targetOffset , int targetCount ,
int fromIndex ) {
2007-12-01 00:00:00 +00:00
/ *
* Check arguments ; return immediately where possible . For
* consistency , don ' t check for null str .
* /
int rightIndex = sourceCount - targetCount ;
if ( fromIndex < 0 ) {
return - 1 ;
}
if ( fromIndex > rightIndex ) {
fromIndex = rightIndex ;
}
/* Empty string always matches. */
if ( targetCount = = 0 ) {
return fromIndex ;
}
int strLastIndex = targetOffset + targetCount - 1 ;
char strLastChar = target [ strLastIndex ] ;
int min = sourceOffset + targetCount - 1 ;
int i = min + fromIndex ;
2013-04-02 18:41:04 -04:00
startSearchForLastChar :
2007-12-01 00:00:00 +00:00
while ( true ) {
while ( i > = min & & source [ i ] ! = strLastChar ) {
i - - ;
}
if ( i < min ) {
return - 1 ;
}
int j = i - 1 ;
int start = j - ( targetCount - 1 ) ;
int k = strLastIndex - 1 ;
while ( j > start ) {
if ( source [ j - - ] ! = target [ k - - ] ) {
i - - ;
continue startSearchForLastChar ;
}
}
return start - sourceOffset + 1 ;
}
}
/ * *
* Returns a new string that is a substring of this string . The
* substring begins with the character at the specified index and
* extends to the end of this string . < p >
* Examples :
* < blockquote > < pre >
* " unhappy " . substring ( 2 ) returns " happy "
* " Harbison " . substring ( 3 ) returns " bison "
* " emptiness " . substring ( 9 ) returns " " ( an empty string )
* < / pre > < / blockquote >
*
* @param beginIndex the beginning index , inclusive .
* @return the specified substring .
* @exception IndexOutOfBoundsException if
2012-01-23 12:17:30 -08:00
* { @code beginIndex } is negative or larger than the
* length of this { @code String } object .
2007-12-01 00:00:00 +00:00
* /
public String substring ( int beginIndex ) {
2012-05-17 10:06:19 -07:00
if ( beginIndex < 0 ) {
throw new StringIndexOutOfBoundsException ( beginIndex ) ;
}
int subLen = value . length - beginIndex ;
if ( subLen < 0 ) {
throw new StringIndexOutOfBoundsException ( subLen ) ;
}
return ( beginIndex = = 0 ) ? this : new String ( value , beginIndex , subLen ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns a new string that is a substring of this string . The
2012-01-23 12:17:30 -08:00
* substring begins at the specified { @code beginIndex } and
* extends to the character at index { @code endIndex - 1 } .
* Thus the length of the substring is { @code endIndex - beginIndex } .
2007-12-01 00:00:00 +00:00
* < p >
* Examples :
* < blockquote > < pre >
* " hamburger " . substring ( 4 , 8 ) returns " urge "
* " smiles " . substring ( 1 , 5 ) returns " mile "
* < / pre > < / blockquote >
*
* @param beginIndex the beginning index , inclusive .
* @param endIndex the ending index , exclusive .
* @return the specified substring .
* @exception IndexOutOfBoundsException if the
2012-01-23 12:17:30 -08:00
* { @code beginIndex } is negative , or
* { @code endIndex } is larger than the length of
* this { @code String } object , or
* { @code beginIndex } is larger than
* { @code endIndex } .
2007-12-01 00:00:00 +00:00
* /
public String substring ( int beginIndex , int endIndex ) {
if ( beginIndex < 0 ) {
throw new StringIndexOutOfBoundsException ( beginIndex ) ;
}
2012-05-17 10:06:19 -07:00
if ( endIndex > value . length ) {
2007-12-01 00:00:00 +00:00
throw new StringIndexOutOfBoundsException ( endIndex ) ;
}
2012-05-17 10:06:19 -07:00
int subLen = endIndex - beginIndex ;
if ( subLen < 0 ) {
throw new StringIndexOutOfBoundsException ( subLen ) ;
2007-12-01 00:00:00 +00:00
}
2012-05-17 10:06:19 -07:00
return ( ( beginIndex = = 0 ) & & ( endIndex = = value . length ) ) ? this
: new String ( value , beginIndex , subLen ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns a new character sequence that is a subsequence of this sequence .
*
* < p > An invocation of this method of the form
*
* < blockquote > < pre >
* str . subSequence ( begin , & nbsp ; end ) < / pre > < / blockquote >
*
* behaves in exactly the same way as the invocation
*
* < blockquote > < pre >
* str . substring ( begin , & nbsp ; end ) < / pre > < / blockquote >
*
2012-06-29 16:16:13 -07:00
* This method is defined so that the { @code String } class can implement
2013-04-02 18:41:04 -04:00
* the { @link CharSequence } interface .
2007-12-01 00:00:00 +00:00
*
2012-06-29 16:16:13 -07:00
* @param beginIndex the begin index , inclusive .
* @param endIndex the end index , exclusive .
* @return the specified subsequence .
2007-12-01 00:00:00 +00:00
*
* @throws IndexOutOfBoundsException
2012-06-29 16:16:13 -07:00
* if { @code beginIndex } or { @code endIndex } is negative ,
* if { @code endIndex } is greater than { @code length ( ) } ,
* or if { @code beginIndex } is greater than { @code endIndex }
2007-12-01 00:00:00 +00:00
*
* @since 1 . 4
* @spec JSR - 51
* /
public CharSequence subSequence ( int beginIndex , int endIndex ) {
return this . substring ( beginIndex , endIndex ) ;
}
/ * *
* Concatenates the specified string to the end of this string .
* < p >
2012-01-23 12:17:30 -08:00
* If the length of the argument string is { @code 0 } , then this
* { @code String } object is returned . Otherwise , a new
* { @code String } object is created , representing a character
2007-12-01 00:00:00 +00:00
* sequence that is the concatenation of the character sequence
2012-01-23 12:17:30 -08:00
* represented by this { @code String } object and the character
2007-12-01 00:00:00 +00:00
* sequence represented by the argument string . < p >
* Examples :
* < blockquote > < pre >
* " cares " . concat ( " s " ) returns " caress "
* " to " . concat ( " get " ) . concat ( " her " ) returns " together "
* < / pre > < / blockquote >
*
2012-01-23 12:17:30 -08:00
* @param str the { @code String } that is concatenated to the end
* of this { @code String } .
2007-12-01 00:00:00 +00:00
* @return a string that represents the concatenation of this object ' s
* characters followed by the string argument ' s characters .
* /
public String concat ( String str ) {
int otherLen = str . length ( ) ;
if ( otherLen = = 0 ) {
return this ;
}
2012-05-17 10:06:19 -07:00
int len = value . length ;
char buf [ ] = Arrays . copyOf ( value , len + otherLen ) ;
str . getChars ( buf , len ) ;
return new String ( buf , true ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Returns a new string resulting from replacing all occurrences of
2012-01-23 12:17:30 -08:00
* { @code oldChar } in this string with { @code newChar } .
2007-12-01 00:00:00 +00:00
* < p >
2012-01-23 12:17:30 -08:00
* If the character { @code oldChar } does not occur in the
* character sequence represented by this { @code String } object ,
* then a reference to this { @code String } object is returned .
* Otherwise , a new { @code String } object is created that
2007-12-01 00:00:00 +00:00
* represents a character sequence identical to the character sequence
2012-01-23 12:17:30 -08:00
* represented by this { @code String } object , except that every
* occurrence of { @code oldChar } is replaced by an occurrence
* of { @code newChar } .
2007-12-01 00:00:00 +00:00
* < p >
* Examples :
* < blockquote > < pre >
* " mesquite in your cellar " . replace ( 'e' , 'o' )
* returns " mosquito in your collar "
* " the war of baronets " . replace ( 'r' , 'y' )
* returns " the way of bayonets "
* " sparring with a purple porpoise " . replace ( 'p' , 't' )
* returns " starring with a turtle tortoise "
* " JonL " . replace ( 'q' , 'x' ) returns " JonL " ( no change )
* < / pre > < / blockquote >
*
* @param oldChar the old character .
* @param newChar the new character .
* @return a string derived from this string by replacing every
2012-01-23 12:17:30 -08:00
* occurrence of { @code oldChar } with { @code newChar } .
2007-12-01 00:00:00 +00:00
* /
public String replace ( char oldChar , char newChar ) {
if ( oldChar ! = newChar ) {
2012-05-17 10:06:19 -07:00
int len = value . length ;
2007-12-01 00:00:00 +00:00
int i = - 1 ;
char [ ] val = value ; /* avoid getfield opcode */
while ( + + i < len ) {
2012-05-17 10:06:19 -07:00
if ( val [ i ] = = oldChar ) {
2007-12-01 00:00:00 +00:00
break ;
}
}
if ( i < len ) {
char buf [ ] = new char [ len ] ;
2012-05-17 10:06:19 -07:00
for ( int j = 0 ; j < i ; j + + ) {
buf [ j ] = val [ j ] ;
2007-12-01 00:00:00 +00:00
}
while ( i < len ) {
2012-05-17 10:06:19 -07:00
char c = val [ i ] ;
2007-12-01 00:00:00 +00:00
buf [ i ] = ( c = = oldChar ) ? newChar : c ;
i + + ;
}
2012-05-17 10:06:19 -07:00
return new String ( buf , true ) ;
2007-12-01 00:00:00 +00:00
}
}
return this ;
}
/ * *
* Tells whether or not this string matches the given < a
* href = " ../util/regex/Pattern.html#sum " > regular expression < / a > .
*
* < p > An invocation of this method of the form
2012-12-28 16:56:54 -05:00
* < i > str < / i > { @code . matches ( } < i > regex < / i > { @code ) } yields exactly the
2007-12-01 00:00:00 +00:00
* same result as the expression
*
2012-12-28 16:56:54 -05:00
* < blockquote >
* { @link java . util . regex . Pattern } . { @link java . util . regex . Pattern # matches ( String , CharSequence )
* matches ( < i > regex < / i > , < i > str < / i > ) }
* < / blockquote >
2007-12-01 00:00:00 +00:00
*
* @param regex
* the regular expression to which this string is to be matched
*
2012-12-28 16:56:54 -05:00
* @return { @code true } if , and only if , this string matches the
2007-12-01 00:00:00 +00:00
* given regular expression
*
* @throws PatternSyntaxException
* if the regular expression ' s syntax is invalid
*
* @see java . util . regex . Pattern
*
* @since 1 . 4
* @spec JSR - 51
* /
public boolean matches ( String regex ) {
return Pattern . matches ( regex , this ) ;
}
/ * *
* Returns true if and only if this string contains the specified
* sequence of char values .
*
* @param s the sequence to search for
2012-01-23 12:17:30 -08:00
* @return true if this string contains { @code s } , false otherwise
2007-12-01 00:00:00 +00:00
* @since 1 . 5
* /
public boolean contains ( CharSequence s ) {
return indexOf ( s . toString ( ) ) > - 1 ;
}
/ * *
* Replaces the first substring of this string that matches the given < a
* href = " ../util/regex/Pattern.html#sum " > regular expression < / a > with the
* given replacement .
*
* < p > An invocation of this method of the form
2012-12-28 16:56:54 -05:00
* < i > str < / i > { @code . replaceFirst ( } < i > regex < / i > { @code , } < i > repl < / i > { @code ) }
2007-12-01 00:00:00 +00:00
* yields exactly the same result as the expression
*
2012-12-28 16:56:54 -05:00
* < blockquote >
* < code >
* { @link java . util . regex . Pattern } . { @link
* java . util . regex . Pattern # compile compile } ( < i > regex < / i > ) . { @link
* java . util . regex . Pattern # matcher ( java . lang . CharSequence ) matcher } ( < i > str < / i > ) . { @link
* java . util . regex . Matcher # replaceFirst replaceFirst } ( < i > repl < / i > )
* < / code >
* < / blockquote >
2007-12-01 00:00:00 +00:00
*
* < p >
2012-12-28 16:56:54 -05:00
* Note that backslashes ( { @code \ } ) and dollar signs ( { @code $ } ) in the
2007-12-01 00:00:00 +00:00
* replacement string may cause the results to be different than if it were
* being treated as a literal replacement string ; see
* { @link java . util . regex . Matcher # replaceFirst } .
* Use { @link java . util . regex . Matcher # quoteReplacement } to suppress the special
* meaning of these characters , if desired .
*
* @param regex
* the regular expression to which this string is to be matched
* @param replacement
* the string to be substituted for the first match
*
2012-12-28 16:56:54 -05:00
* @return The resulting { @code String }
2007-12-01 00:00:00 +00:00
*
* @throws PatternSyntaxException
* if the regular expression ' s syntax is invalid
*
* @see java . util . regex . Pattern
*
* @since 1 . 4
* @spec JSR - 51
* /
public String replaceFirst ( String regex , String replacement ) {
return Pattern . compile ( regex ) . matcher ( this ) . replaceFirst ( replacement ) ;
}
/ * *
* Replaces each substring of this string that matches the given < a
* href = " ../util/regex/Pattern.html#sum " > regular expression < / a > with the
* given replacement .
*
* < p > An invocation of this method of the form
2012-12-28 16:56:54 -05:00
* < i > str < / i > { @code . replaceAll ( } < i > regex < / i > { @code , } < i > repl < / i > { @code ) }
2007-12-01 00:00:00 +00:00
* yields exactly the same result as the expression
*
2012-12-28 16:56:54 -05:00
* < blockquote >
* < code >
* { @link java . util . regex . Pattern } . { @link
* java . util . regex . Pattern # compile compile } ( < i > regex < / i > ) . { @link
* java . util . regex . Pattern # matcher ( java . lang . CharSequence ) matcher } ( < i > str < / i > ) . { @link
* java . util . regex . Matcher # replaceAll replaceAll } ( < i > repl < / i > )
* < / code >
* < / blockquote >
2007-12-01 00:00:00 +00:00
*
* < p >
2012-12-28 16:56:54 -05:00
* Note that backslashes ( { @code \ } ) and dollar signs ( { @code $ } ) in the
2007-12-01 00:00:00 +00:00
* replacement string may cause the results to be different than if it were
* being treated as a literal replacement string ; see
* { @link java . util . regex . Matcher # replaceAll Matcher . replaceAll } .
* Use { @link java . util . regex . Matcher # quoteReplacement } to suppress the special
* meaning of these characters , if desired .
*
* @param regex
* the regular expression to which this string is to be matched
* @param replacement
* the string to be substituted for each match
*
2012-12-28 16:56:54 -05:00
* @return The resulting { @code String }
2007-12-01 00:00:00 +00:00
*
* @throws PatternSyntaxException
* if the regular expression ' s syntax is invalid
*
* @see java . util . regex . Pattern
*
* @since 1 . 4
* @spec JSR - 51
* /
public String replaceAll ( String regex , String replacement ) {
return Pattern . compile ( regex ) . matcher ( this ) . replaceAll ( replacement ) ;
}
/ * *
* Replaces each substring of this string that matches the literal target
* sequence with the specified literal replacement sequence . The
* replacement proceeds from the beginning of the string to the end , for
* example , replacing " aa " with " b " in the string " aaa " will result in
* " ba " rather than " ab " .
*
* @param target The sequence of char values to be replaced
* @param replacement The replacement sequence of char values
* @return The resulting string
* @since 1 . 5
* /
public String replace ( CharSequence target , CharSequence replacement ) {
return Pattern . compile ( target . toString ( ) , Pattern . LITERAL ) . matcher (
2012-05-17 10:06:19 -07:00
this ) . replaceAll ( Matcher . quoteReplacement ( replacement . toString ( ) ) ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
* Splits this string around matches of the given
* < a href = " ../util/regex/Pattern.html#sum " > regular expression < / a > .
*
* < p > The array returned by this method contains each substring of this
* string that is terminated by another substring that matches the given
* expression or is terminated by the end of the string . The substrings in
* the array are in the order in which they occur in this string . If the
* expression does not match any part of the input then the resulting array
* has just one element , namely this string .
*
2012-12-28 16:56:54 -05:00
* < p > The { @code limit } parameter controls the number of times the
2007-12-01 00:00:00 +00:00
* pattern is applied and therefore affects the length of the resulting
* array . If the limit < i > n < / i > is greater than zero then the pattern
* will be applied at most < i > n < / i > & nbsp ; - & nbsp ; 1 times , the array ' s
* length will be no greater than < i > n < / i > , and the array ' s last entry
* will contain all input beyond the last matched delimiter . If < i > n < / i >
* is non - positive then the pattern will be applied as many times as
* possible and the array can have any length . If < i > n < / i > is zero then
* the pattern will be applied as many times as possible , the array can
* have any length , and trailing empty strings will be discarded .
*
2012-12-28 16:56:54 -05:00
* < p > The string { @code " boo:and:foo " } , for example , yields the
2007-12-01 00:00:00 +00:00
* following results with these parameters :
*
* < blockquote > < table cellpadding = 1 cellspacing = 0 summary = " Split example showing regex, limit, and result " >
* < tr >
* < th > Regex < / th >
* < th > Limit < / th >
* < th > Result < / th >
* < / tr >
* < tr > < td align = center > : < / td >
* < td align = center > 2 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " boo " , " and:foo " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > : < / td >
* < td align = center > 5 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " boo " , " and " , " foo " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > : < / td >
* < td align = center > - 2 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " boo " , " and " , " foo " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > o < / td >
* < td align = center > 5 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " b " , " " , " :and:f " , " " , " " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > o < / td >
* < td align = center > - 2 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " b " , " " , " :and:f " , " " , " " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > o < / td >
* < td align = center > 0 < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " b " , " " , " :and:f " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < / table > < / blockquote >
*
* < p > An invocation of this method of the form
2012-12-28 16:56:54 -05:00
* < i > str . < / i > { @code split ( } < i > regex < / i > { @code , } & nbsp ; < i > n < / i > { @code ) }
2007-12-01 00:00:00 +00:00
* yields the same result as the expression
*
* < blockquote >
2012-12-28 16:56:54 -05:00
* < code >
* { @link java . util . regex . Pattern } . { @link
* java . util . regex . Pattern # compile compile } ( < i > regex < / i > ) . { @link
* java . util . regex . Pattern # split ( java . lang . CharSequence , int ) split } ( < i > str < / i > , & nbsp ; < i > n < / i > )
* < / code >
2007-12-01 00:00:00 +00:00
* < / blockquote >
*
*
* @param regex
* the delimiting regular expression
*
* @param limit
* the result threshold , as described above
*
* @return the array of strings computed by splitting this string
* around matches of the given regular expression
*
* @throws PatternSyntaxException
* if the regular expression ' s syntax is invalid
*
* @see java . util . regex . Pattern
*
* @since 1 . 4
* @spec JSR - 51
* /
public String [ ] split ( String regex , int limit ) {
2009-08-13 10:50:23 -07:00
/ * fastpath if the regex is a
2012-05-17 10:06:19 -07:00
( 1 ) one - char String and this character is not one of the
RegEx ' s meta characters " .$|()[{^?*+ \\ " , or
( 2 ) two - char String and the first char is the backslash and
the second is not the ascii digit or ascii letter .
* /
2009-08-13 10:50:23 -07:00
char ch = 0 ;
2012-05-17 10:06:19 -07:00
if ( ( ( regex . value . length = = 1 & &
2009-08-13 10:50:23 -07:00
" .$|()[{^?*+ \\ " . indexOf ( ch = regex . charAt ( 0 ) ) = = - 1 ) | |
( regex . length ( ) = = 2 & &
regex . charAt ( 0 ) = = '\\' & &
( ( ( ch = regex . charAt ( 1 ) ) - '0' ) | ( '9' - ch ) ) < 0 & &
( ( ch - 'a' ) | ( 'z' - ch ) ) < 0 & &
( ( ch - 'A' ) | ( 'Z' - ch ) ) < 0 ) ) & &
( ch < Character . MIN_HIGH_SURROGATE | |
ch > Character . MAX_LOW_SURROGATE ) )
{
int off = 0 ;
int next = 0 ;
boolean limited = limit > 0 ;
2010-12-20 13:47:04 -08:00
ArrayList < String > list = new ArrayList < > ( ) ;
2009-08-13 10:50:23 -07:00
while ( ( next = indexOf ( ch , off ) ) ! = - 1 ) {
if ( ! limited | | list . size ( ) < limit - 1 ) {
list . add ( substring ( off , next ) ) ;
off = next + 1 ;
} else { // last one
//assert (list.size() == limit - 1);
2012-05-17 10:06:19 -07:00
list . add ( substring ( off , value . length ) ) ;
off = value . length ;
2009-08-13 10:50:23 -07:00
break ;
}
}
// If no match was found, return this
if ( off = = 0 )
2012-05-17 10:06:19 -07:00
return new String [ ] { this } ;
2009-08-13 10:50:23 -07:00
// Add remaining segment
if ( ! limited | | list . size ( ) < limit )
2012-05-17 10:06:19 -07:00
list . add ( substring ( off , value . length ) ) ;
2009-08-13 10:50:23 -07:00
// Construct result
int resultSize = list . size ( ) ;
2013-04-02 18:41:04 -04:00
if ( limit = = 0 ) {
while ( resultSize > 0 & & list . get ( resultSize - 1 ) . length ( ) = = 0 ) {
2009-08-13 10:50:23 -07:00
resultSize - - ;
2013-04-02 18:41:04 -04:00
}
}
2009-08-13 10:50:23 -07:00
String [ ] result = new String [ resultSize ] ;
return list . subList ( 0 , resultSize ) . toArray ( result ) ;
}
2007-12-01 00:00:00 +00:00
return Pattern . compile ( regex ) . split ( this , limit ) ;
}
/ * *
* Splits this string around matches of the given < a
* href = " ../util/regex/Pattern.html#sum " > regular expression < / a > .
*
* < p > This method works as if by invoking the two - argument { @link
* # split ( String , int ) split } method with the given expression and a limit
* argument of zero . Trailing empty strings are therefore not included in
* the resulting array .
*
2012-12-28 16:56:54 -05:00
* < p > The string { @code " boo:and:foo " } , for example , yields the following
2007-12-01 00:00:00 +00:00
* results with these expressions :
*
* < blockquote > < table cellpadding = 1 cellspacing = 0 summary = " Split examples showing regex and result " >
* < tr >
* < th > Regex < / th >
* < th > Result < / th >
* < / tr >
* < tr > < td align = center > : < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " boo " , " and " , " foo " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < tr > < td align = center > o < / td >
2012-12-28 16:56:54 -05:00
* < td > { @code { " b " , " " , " :and:f " } } < / td > < / tr >
2007-12-01 00:00:00 +00:00
* < / table > < / blockquote >
*
*
* @param regex
* the delimiting regular expression
*
* @return the array of strings computed by splitting this string
* around matches of the given regular expression
*
* @throws PatternSyntaxException
* if the regular expression ' s syntax is invalid
*
* @see java . util . regex . Pattern
*
* @since 1 . 4
* @spec JSR - 51
* /
public String [ ] split ( String regex ) {
return split ( regex , 0 ) ;
}
2013-04-02 18:41:04 -04:00
/ * *
* Returns a new String composed of copies of the
* { @code CharSequence elements } joined together with a copy of
* the specified { @code delimiter } .
*
* < blockquote > For example ,
* < pre > { @code
* String message = String . join ( " - " , " Java " , " is " , " cool " ) ;
* // message returned is: "Java-is-cool"
* } < / pre > < / blockquote >
*
* Note that if an element is null , then { @code " null " } is added .
*
* @param delimiter the delimiter that separates each element
* @param elements the elements to join together .
*
* @return a new { @code String } that is composed of the { @code elements }
* separated by the { @code delimiter }
*
* @throws NullPointerException If { @code delimiter } or { @code elements }
* is { @code null }
*
* @see java . util . StringJoiner
* @since 1 . 8
* /
public static String join ( CharSequence delimiter , CharSequence . . . elements ) {
Objects . requireNonNull ( delimiter ) ;
Objects . requireNonNull ( elements ) ;
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner ( delimiter ) ;
for ( CharSequence cs : elements ) {
joiner . add ( cs ) ;
}
return joiner . toString ( ) ;
}
/ * *
* Returns a new { @code String } composed of copies of the
* { @code CharSequence elements } joined together with a copy of the
* specified { @code delimiter } .
*
* < blockquote > For example ,
* < pre > { @code
* List < String > strings = new LinkedList < > ( ) ;
* strings . add ( " Java " ) ; strings . add ( " is " ) ;
* strings . add ( " cool " ) ;
* String message = String . join ( " " , strings ) ;
* //message returned is: "Java is cool"
*
* Set < String > strings = new HashSet < > ( ) ;
* Strings . add ( " Java " ) ; strings . add ( " is " ) ;
* strings . add ( " very " ) ; strings . add ( " cool " ) ;
* String message = String . join ( " - " , strings ) ;
* //message returned is: "Java-is-very-cool"
* } < / pre > < / blockquote >
*
* Note that if an individual element is { @code null } , then { @code " null " } is added .
*
* @param delimiter a sequence of characters that is used to separate each
* of the { @code elements } in the resulting { @code String }
* @param elements an { @code Iterable } that will have its { @code elements }
* joined together .
*
* @return a new { @code String } that is composed from the { @code elements }
* argument
*
* @throws NullPointerException If { @code delimiter } or { @code elements }
* is { @code null }
*
* @see # join ( CharSequence , CharSequence . . . )
* @see java . util . StringJoiner
* @since 1 . 8
* /
public static String join ( CharSequence delimiter ,
Iterable < ? extends CharSequence > elements ) {
Objects . requireNonNull ( delimiter ) ;
Objects . requireNonNull ( elements ) ;
StringJoiner joiner = new StringJoiner ( delimiter ) ;
for ( CharSequence cs : elements ) {
joiner . add ( cs ) ;
}
return joiner . toString ( ) ;
}
2007-12-01 00:00:00 +00:00
/ * *
2012-01-23 12:17:30 -08:00
* Converts all of the characters in this { @code String } to lower
* case using the rules of the given { @code Locale } . Case mapping is based
2007-12-01 00:00:00 +00:00
* on the Unicode Standard version specified by the { @link java . lang . Character Character }
* class . Since case mappings are not always 1 : 1 char mappings , the resulting
2012-01-23 12:17:30 -08:00
* { @code String } may be a different length than the original { @code String } .
2007-12-01 00:00:00 +00:00
* < p >
* Examples of lowercase mappings are in the following table :
* < table border = " 1 " summary = " Lowercase mapping examples showing language code of locale, upper case, lower case, and description " >
* < tr >
* < th > Language Code of Locale < / th >
* < th > Upper Case < / th >
* < th > Lower Case < / th >
* < th > Description < / th >
* < / tr >
* < tr >
* < td > tr ( Turkish ) < / td >
* < td > & # 92 ; u0130 < / td >
* < td > & # 92 ; u0069 < / td >
* < td > capital letter I with dot above - & gt ; small letter i < / td >
* < / tr >
* < tr >
* < td > tr ( Turkish ) < / td >
* < td > & # 92 ; u0049 < / td >
* < td > & # 92 ; u0131 < / td >
* < td > capital letter I - & gt ; small letter dotless i < / td >
* < / tr >
* < tr >
* < td > ( all ) < / td >
* < td > French Fries < / td >
* < td > french fries < / td >
* < td > lowercased all chars in String < / td >
* < / tr >
* < tr >
* < td > ( all ) < / td >
* < td > < img src = " doc-files/capiota.gif " alt = " capiota " > < img src = " doc-files/capchi.gif " alt = " capchi " >
* < img src = " doc-files/captheta.gif " alt = " captheta " > < img src = " doc-files/capupsil.gif " alt = " capupsil " >
* < img src = " doc-files/capsigma.gif " alt = " capsigma " > < / td >
* < td > < img src = " doc-files/iota.gif " alt = " iota " > < img src = " doc-files/chi.gif " alt = " chi " >
* < img src = " doc-files/theta.gif " alt = " theta " > < img src = " doc-files/upsilon.gif " alt = " upsilon " >
* < img src = " doc-files/sigma1.gif " alt = " sigma " > < / td >
* < td > lowercased all chars in String < / td >
* < / tr >
* < / table >
*
* @param locale use the case transformation rules for this locale
2012-01-23 12:17:30 -08:00
* @return the { @code String } , converted to lowercase .
2007-12-01 00:00:00 +00:00
* @see java . lang . String # toLowerCase ( )
* @see java . lang . String # toUpperCase ( )
* @see java . lang . String # toUpperCase ( Locale )
* @since 1 . 1
* /
public String toLowerCase ( Locale locale ) {
if ( locale = = null ) {
throw new NullPointerException ( ) ;
}
2012-05-17 10:06:19 -07:00
int firstUpper ;
final int len = value . length ;
2007-12-01 00:00:00 +00:00
/* Now check if there are any characters that need to be changed. */
scan : {
2012-05-17 10:06:19 -07:00
for ( firstUpper = 0 ; firstUpper < len ; ) {
char c = value [ firstUpper ] ;
if ( ( c > = Character . MIN_HIGH_SURROGATE )
& & ( c < = Character . MAX_HIGH_SURROGATE ) ) {
2007-12-01 00:00:00 +00:00
int supplChar = codePointAt ( firstUpper ) ;
if ( supplChar ! = Character . toLowerCase ( supplChar ) ) {
break scan ;
}
firstUpper + = Character . charCount ( supplChar ) ;
} else {
if ( c ! = Character . toLowerCase ( c ) ) {
break scan ;
}
firstUpper + + ;
}
}
return this ;
}
2012-05-17 10:06:19 -07:00
char [ ] result = new char [ len ] ;
int resultOffset = 0 ; / * result may grow , so i + resultOffset
* is the write location in result * /
2007-12-01 00:00:00 +00:00
/* Just copy the first few lowerCase characters. */
2012-05-17 10:06:19 -07:00
System . arraycopy ( value , 0 , result , 0 , firstUpper ) ;
2007-12-01 00:00:00 +00:00
String lang = locale . getLanguage ( ) ;
boolean localeDependent =
2012-05-17 10:06:19 -07:00
( lang = = " tr " | | lang = = " az " | | lang = = " lt " ) ;
2007-12-01 00:00:00 +00:00
char [ ] lowerCharArray ;
int lowerChar ;
int srcChar ;
int srcCount ;
2012-05-17 10:06:19 -07:00
for ( int i = firstUpper ; i < len ; i + = srcCount ) {
srcChar = ( int ) value [ i ] ;
if ( ( char ) srcChar > = Character . MIN_HIGH_SURROGATE
& & ( char ) srcChar < = Character . MAX_HIGH_SURROGATE ) {
2007-12-01 00:00:00 +00:00
srcChar = codePointAt ( i ) ;
srcCount = Character . charCount ( srcChar ) ;
} else {
srcCount = 1 ;
}
if ( localeDependent | | srcChar = = '\u03A3' ) { // GREEK CAPITAL LETTER SIGMA
lowerChar = ConditionalSpecialCasing . toLowerCaseEx ( this , i , locale ) ;
2009-04-10 11:51:36 +09:00
} else if ( srcChar = = '\u0130' ) { // LATIN CAPITAL LETTER I DOT
lowerChar = Character . ERROR ;
2007-12-01 00:00:00 +00:00
} else {
lowerChar = Character . toLowerCase ( srcChar ) ;
}
2012-05-17 10:06:19 -07:00
if ( ( lowerChar = = Character . ERROR )
| | ( lowerChar > = Character . MIN_SUPPLEMENTARY_CODE_POINT ) ) {
2007-12-01 00:00:00 +00:00
if ( lowerChar = = Character . ERROR ) {
2012-05-17 10:06:19 -07:00
if ( ! localeDependent & & srcChar = = '\u0130' ) {
2009-04-10 11:51:36 +09:00
lowerCharArray =
2012-05-17 10:06:19 -07:00
ConditionalSpecialCasing . toLowerCaseCharArray ( this , i , Locale . ENGLISH ) ;
} else {
lowerCharArray =
ConditionalSpecialCasing . toLowerCaseCharArray ( this , i , locale ) ;
}
2007-12-01 00:00:00 +00:00
} else if ( srcCount = = 2 ) {
resultOffset + = Character . toChars ( lowerChar , result , i + resultOffset ) - srcCount ;
continue ;
} else {
lowerCharArray = Character . toChars ( lowerChar ) ;
}
/* Grow result if needed */
int mapLen = lowerCharArray . length ;
if ( mapLen > srcCount ) {
char [ ] result2 = new char [ result . length + mapLen - srcCount ] ;
2012-05-17 10:06:19 -07:00
System . arraycopy ( result , 0 , result2 , 0 , i + resultOffset ) ;
2007-12-01 00:00:00 +00:00
result = result2 ;
}
2012-05-17 10:06:19 -07:00
for ( int x = 0 ; x < mapLen ; + + x ) {
result [ i + resultOffset + x ] = lowerCharArray [ x ] ;
2007-12-01 00:00:00 +00:00
}
resultOffset + = ( mapLen - srcCount ) ;
} else {
2012-05-17 10:06:19 -07:00
result [ i + resultOffset ] = ( char ) lowerChar ;
2007-12-01 00:00:00 +00:00
}
}
2012-05-17 10:06:19 -07:00
return new String ( result , 0 , len + resultOffset ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Converts all of the characters in this { @code String } to lower
2007-12-01 00:00:00 +00:00
* case using the rules of the default locale . This is equivalent to calling
2012-01-23 12:17:30 -08:00
* { @code toLowerCase ( Locale . getDefault ( ) ) } .
2007-12-01 00:00:00 +00:00
* < p >
* < b > Note : < / b > This method is locale sensitive , and may produce unexpected
* results if used for strings that are intended to be interpreted locale
* independently .
* Examples are programming language identifiers , protocol keys , and HTML
* tags .
2012-01-23 12:17:30 -08:00
* For instance , { @code " TITLE " . toLowerCase ( ) } in a Turkish locale
* returns { @code " t \ u005Cu0131tle " } , where ' \ u005Cu0131 ' is the
2010-05-09 16:37:06 -07:00
* LATIN SMALL LETTER DOTLESS I character .
2007-12-01 00:00:00 +00:00
* To obtain correct results for locale insensitive strings , use
2012-01-23 12:17:30 -08:00
* { @code toLowerCase ( Locale . ENGLISH ) } .
2007-12-01 00:00:00 +00:00
* < p >
2012-01-23 12:17:30 -08:00
* @return the { @code String } , converted to lowercase .
2007-12-01 00:00:00 +00:00
* @see java . lang . String # toLowerCase ( Locale )
* /
public String toLowerCase ( ) {
return toLowerCase ( Locale . getDefault ( ) ) ;
}
/ * *
2012-01-23 12:17:30 -08:00
* Converts all of the characters in this { @code String } to upper
* case using the rules of the given { @code Locale } . Case mapping is based
2007-12-01 00:00:00 +00:00
* on the Unicode Standard version specified by the { @link java . lang . Character Character }
* class . Since case mappings are not always 1 : 1 char mappings , the resulting
2012-01-23 12:17:30 -08:00
* { @code String } may be a different length than the original { @code String } .
2007-12-01 00:00:00 +00:00
* < p >
* Examples of locale - sensitive and 1 : M case mappings are in the following table .
* < p >
* < table border = " 1 " summary = " Examples of locale-sensitive and 1:M case mappings. Shows Language code of locale, lower case, upper case, and description. " >
* < tr >
* < th > Language Code of Locale < / th >
* < th > Lower Case < / th >
* < th > Upper Case < / th >
* < th > Description < / th >
* < / tr >
* < tr >
* < td > tr ( Turkish ) < / td >
* < td > & # 92 ; u0069 < / td >
* < td > & # 92 ; u0130 < / td >
* < td > small letter i - & gt ; capital letter I with dot above < / td >
* < / tr >
* < tr >
* < td > tr ( Turkish ) < / td >
* < td > & # 92 ; u0131 < / td >
* < td > & # 92 ; u0049 < / td >
* < td > small letter dotless i - & gt ; capital letter I < / td >
* < / tr >
* < tr >
* < td > ( all ) < / td >
* < td > & # 92 ; u00df < / td >
* < td > & # 92 ; u0053 & # 92 ; u0053 < / td >
* < td > small letter sharp s - & gt ; two letters : SS < / td >
* < / tr >
* < tr >
* < td > ( all ) < / td >
* < td > Fahrvergn & uuml ; gen < / td >
* < td > FAHRVERGN & Uuml ; GEN < / td >
* < td > < / td >
* < / tr >
* < / table >
* @param locale use the case transformation rules for this locale
2012-01-23 12:17:30 -08:00
* @return the { @code String } , converted to uppercase .
2007-12-01 00:00:00 +00:00
* @see java . lang . String # toUpperCase ( )
* @see java . lang . String # toLowerCase ( )
* @see java . lang . String # toLowerCase ( Locale )
* @since 1 . 1
* /
public String toUpperCase ( Locale locale ) {
if ( locale = = null ) {
throw new NullPointerException ( ) ;
}
2012-05-17 10:06:19 -07:00
int firstLower ;
final int len = value . length ;
2007-12-01 00:00:00 +00:00
/* Now check if there are any characters that need to be changed. */
scan : {
2012-05-17 10:06:19 -07:00
for ( firstLower = 0 ; firstLower < len ; ) {
int c = ( int ) value [ firstLower ] ;
2007-12-01 00:00:00 +00:00
int srcCount ;
2012-05-17 10:06:19 -07:00
if ( ( c > = Character . MIN_HIGH_SURROGATE )
& & ( c < = Character . MAX_HIGH_SURROGATE ) ) {
2007-12-01 00:00:00 +00:00
c = codePointAt ( firstLower ) ;
srcCount = Character . charCount ( c ) ;
} else {
srcCount = 1 ;
}
int upperCaseChar = Character . toUpperCaseEx ( c ) ;
2012-05-17 10:06:19 -07:00
if ( ( upperCaseChar = = Character . ERROR )
| | ( c ! = upperCaseChar ) ) {
2007-12-01 00:00:00 +00:00
break scan ;
}
firstLower + = srcCount ;
}
return this ;
}
2013-04-02 18:41:04 -04:00
/* result may grow, so i+resultOffset is the write location in result */
int resultOffset = 0 ;
2012-05-17 10:06:19 -07:00
char [ ] result = new char [ len ] ; /* may grow */
2007-12-01 00:00:00 +00:00
/* Just copy the first few upperCase characters. */
2012-05-17 10:06:19 -07:00
System . arraycopy ( value , 0 , result , 0 , firstLower ) ;
2007-12-01 00:00:00 +00:00
String lang = locale . getLanguage ( ) ;
boolean localeDependent =
2012-05-17 10:06:19 -07:00
( lang = = " tr " | | lang = = " az " | | lang = = " lt " ) ;
2007-12-01 00:00:00 +00:00
char [ ] upperCharArray ;
int upperChar ;
int srcChar ;
int srcCount ;
2012-05-17 10:06:19 -07:00
for ( int i = firstLower ; i < len ; i + = srcCount ) {
srcChar = ( int ) value [ i ] ;
2007-12-01 00:00:00 +00:00
if ( ( char ) srcChar > = Character . MIN_HIGH_SURROGATE & &
( char ) srcChar < = Character . MAX_HIGH_SURROGATE ) {
srcChar = codePointAt ( i ) ;
srcCount = Character . charCount ( srcChar ) ;
} else {
srcCount = 1 ;
}
if ( localeDependent ) {
upperChar = ConditionalSpecialCasing . toUpperCaseEx ( this , i , locale ) ;
} else {
upperChar = Character . toUpperCaseEx ( srcChar ) ;
}
2012-05-17 10:06:19 -07:00
if ( ( upperChar = = Character . ERROR )
| | ( upperChar > = Character . MIN_SUPPLEMENTARY_CODE_POINT ) ) {
2007-12-01 00:00:00 +00:00
if ( upperChar = = Character . ERROR ) {
if ( localeDependent ) {
upperCharArray =
2012-05-17 10:06:19 -07:00
ConditionalSpecialCasing . toUpperCaseCharArray ( this , i , locale ) ;
2007-12-01 00:00:00 +00:00
} else {
upperCharArray = Character . toUpperCaseCharArray ( srcChar ) ;
}
} else if ( srcCount = = 2 ) {
resultOffset + = Character . toChars ( upperChar , result , i + resultOffset ) - srcCount ;
continue ;
} else {
upperCharArray = Character . toChars ( upperChar ) ;
}
/* Grow result if needed */
int mapLen = upperCharArray . length ;
if ( mapLen > srcCount ) {
char [ ] result2 = new char [ result . length + mapLen - srcCount ] ;
2012-05-17 10:06:19 -07:00
System . arraycopy ( result , 0 , result2 , 0 , i + resultOffset ) ;
2007-12-01 00:00:00 +00:00
result = result2 ;
}
2012-05-17 10:06:19 -07:00
for ( int x = 0 ; x < mapLen ; + + x ) {
result [ i + resultOffset + x ] = upperCharArray [ x ] ;
2007-12-01 00:00:00 +00:00
}
resultOffset + = ( mapLen - srcCount ) ;
} else {
2012-05-17 10:06:19 -07:00
result [ i + resultOffset ] = ( char ) upperChar ;
2007-12-01 00:00:00 +00:00
}
}
2012-05-17 10:06:19 -07:00
return new String ( result , 0 , len + resultOffset ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Converts all of the characters in this { @code String } to upper
2007-12-01 00:00:00 +00:00
* case using the rules of the default locale . This method is equivalent to
2012-01-23 12:17:30 -08:00
* { @code toUpperCase ( Locale . getDefault ( ) ) } .
2007-12-01 00:00:00 +00:00
* < p >
* < b > Note : < / b > This method is locale sensitive , and may produce unexpected
* results if used for strings that are intended to be interpreted locale
* independently .
* Examples are programming language identifiers , protocol keys , and HTML
* tags .
2012-01-23 12:17:30 -08:00
* For instance , { @code " title " . toUpperCase ( ) } in a Turkish locale
* returns { @code " T \ u005Cu0130TLE " } , where ' \ u005Cu0130 ' is the
2010-05-09 16:37:06 -07:00
* LATIN CAPITAL LETTER I WITH DOT ABOVE character .
2007-12-01 00:00:00 +00:00
* To obtain correct results for locale insensitive strings , use
2012-01-23 12:17:30 -08:00
* { @code toUpperCase ( Locale . ENGLISH ) } .
2007-12-01 00:00:00 +00:00
* < p >
2012-01-23 12:17:30 -08:00
* @return the { @code String } , converted to uppercase .
2007-12-01 00:00:00 +00:00
* @see java . lang . String # toUpperCase ( Locale )
* /
public String toUpperCase ( ) {
return toUpperCase ( Locale . getDefault ( ) ) ;
}
/ * *
* Returns a copy of the string , with leading and trailing whitespace
* omitted .
* < p >
2012-01-23 12:17:30 -08:00
* If this { @code String } object represents an empty character
2007-12-01 00:00:00 +00:00
* sequence , or the first and last characters of character sequence
2012-01-23 12:17:30 -08:00
* represented by this { @code String } object both have codes
* greater than { @code ' \ u005Cu0020 ' } ( the space character ) , then a
* reference to this { @code String } object is returned .
2007-12-01 00:00:00 +00:00
* < p >
* Otherwise , if there is no character with a code greater than
2012-01-23 12:17:30 -08:00
* { @code ' \ u005Cu0020 ' } in the string , then a new
* { @code String } object representing an empty string is created
2007-12-01 00:00:00 +00:00
* and returned .
* < p >
* Otherwise , let < i > k < / i > be the index of the first character in the
2012-01-23 12:17:30 -08:00
* string whose code is greater than { @code ' \ u005Cu0020 ' } , and let
2007-12-01 00:00:00 +00:00
* < i > m < / i > be the index of the last character in the string whose code
2012-01-23 12:17:30 -08:00
* is greater than { @code ' \ u005Cu0020 ' } . A new { @code String }
2007-12-01 00:00:00 +00:00
* object is created , representing the substring of this string that
* begins with the character at index < i > k < / i > and ends with the
* character at index < i > m < / i > - that is , the result of
2013-04-02 18:41:04 -04:00
* { @code this . substring ( k , m + 1 ) } .
2007-12-01 00:00:00 +00:00
* < p >
* This method may be used to trim whitespace ( as defined above ) from
* the beginning and end of a string .
*
* @return A copy of this string with leading and trailing white
* space removed , or this string if it has no leading or
* trailing white space .
* /
public String trim ( ) {
2012-05-17 10:06:19 -07:00
int len = value . length ;
2007-12-01 00:00:00 +00:00
int st = 0 ;
char [ ] val = value ; /* avoid getfield opcode */
2012-05-17 10:06:19 -07:00
while ( ( st < len ) & & ( val [ st ] < = ' ' ) ) {
2007-12-01 00:00:00 +00:00
st + + ;
}
2012-05-17 10:06:19 -07:00
while ( ( st < len ) & & ( val [ len - 1 ] < = ' ' ) ) {
2007-12-01 00:00:00 +00:00
len - - ;
}
2012-05-17 10:06:19 -07:00
return ( ( st > 0 ) | | ( len < value . length ) ) ? substring ( st , len ) : this ;
2007-12-01 00:00:00 +00:00
}
/ * *
* This object ( which is already a string ! ) is itself returned .
*
* @return the string itself .
* /
public String toString ( ) {
return this ;
}
/ * *
* Converts this string to a new character array .
*
* @return a newly allocated character array whose length is the length
* of this string and whose contents are initialized to contain
* the character sequence represented by this string .
* /
public char [ ] toCharArray ( ) {
2012-05-17 10:06:19 -07:00
// Cannot use Arrays.copyOf because of class initialization order issues
char result [ ] = new char [ value . length ] ;
System . arraycopy ( value , 0 , result , 0 , value . length ) ;
2007-12-01 00:00:00 +00:00
return result ;
}
/ * *
* Returns a formatted string using the specified format string and
* arguments .
*
* < p > The locale always used is the one returned by { @link
* java . util . Locale # getDefault ( ) Locale . getDefault ( ) } .
*
* @param format
* A < a href = " ../util/Formatter.html#syntax " > format string < / a >
*
* @param args
* Arguments referenced by the format specifiers in the format
* string . If there are more arguments than format specifiers , the
* extra arguments are ignored . The number of arguments is
* variable and may be zero . The maximum number of arguments is
* limited by the maximum dimension of a Java array as defined by
2011-04-13 12:16:13 -07:00
* < cite > The Java & trade ; Virtual Machine Specification < / cite > .
* The behaviour on a
2012-12-28 16:56:54 -05:00
* { @code null } argument depends on the < a
2007-12-01 00:00:00 +00:00
* href = " ../util/Formatter.html#syntax " > conversion < / a > .
*
2012-10-01 15:36:57 +01:00
* @throws java . util . IllegalFormatException
2007-12-01 00:00:00 +00:00
* If a format string contains an illegal syntax , a format
* specifier that is incompatible with the given arguments ,
* insufficient arguments given the format string , or other
* illegal conditions . For specification of all possible
* formatting errors , see the < a
* href = " ../util/Formatter.html#detail " > Details < / a > section of the
* formatter class specification .
*
* @return A formatted string
*
* @see java . util . Formatter
* @since 1 . 5
* /
2012-05-17 10:06:19 -07:00
public static String format ( String format , Object . . . args ) {
2007-12-01 00:00:00 +00:00
return new Formatter ( ) . format ( format , args ) . toString ( ) ;
}
/ * *
* Returns a formatted string using the specified locale , format string ,
* and arguments .
*
* @param l
* The { @linkplain java . util . Locale locale } to apply during
2012-12-28 16:56:54 -05:00
* formatting . If { @code l } is { @code null } then no localization
2007-12-01 00:00:00 +00:00
* is applied .
*
* @param format
* A < a href = " ../util/Formatter.html#syntax " > format string < / a >
*
* @param args
* Arguments referenced by the format specifiers in the format
* string . If there are more arguments than format specifiers , the
* extra arguments are ignored . The number of arguments is
* variable and may be zero . The maximum number of arguments is
* limited by the maximum dimension of a Java array as defined by
2011-04-13 12:16:13 -07:00
* < cite > The Java & trade ; Virtual Machine Specification < / cite > .
* The behaviour on a
2013-01-22 11:14:13 -05:00
* { @code null } argument depends on the
* < a href = " ../util/Formatter.html#syntax " > conversion < / a > .
2007-12-01 00:00:00 +00:00
*
2012-10-01 15:36:57 +01:00
* @throws java . util . IllegalFormatException
2007-12-01 00:00:00 +00:00
* If a format string contains an illegal syntax , a format
* specifier that is incompatible with the given arguments ,
* insufficient arguments given the format string , or other
* illegal conditions . For specification of all possible
* formatting errors , see the < a
* href = " ../util/Formatter.html#detail " > Details < / a > section of the
* formatter class specification
*
* @return A formatted string
*
* @see java . util . Formatter
* @since 1 . 5
* /
2012-05-17 10:06:19 -07:00
public static String format ( Locale l , String format , Object . . . args ) {
2007-12-01 00:00:00 +00:00
return new Formatter ( l ) . format ( format , args ) . toString ( ) ;
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code Object } argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param obj an { @code Object } .
* @return if the argument is { @code null } , then a string equal to
* { @code " null " } ; otherwise , the value of
* { @code obj . toString ( ) } is returned .
2007-12-01 00:00:00 +00:00
* @see java . lang . Object # toString ( )
* /
public static String valueOf ( Object obj ) {
return ( obj = = null ) ? " null " : obj . toString ( ) ;
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code char } array
2007-12-01 00:00:00 +00:00
* argument . The contents of the character array are copied ; subsequent
* modification of the character array does not affect the newly
* created string .
*
2012-01-23 12:17:30 -08:00
* @param data a { @code char } array .
2007-12-01 00:00:00 +00:00
* @return a newly allocated string representing the same sequence of
* characters contained in the character array argument .
* /
public static String valueOf ( char data [ ] ) {
return new String ( data ) ;
}
/ * *
* Returns the string representation of a specific subarray of the
2012-01-23 12:17:30 -08:00
* { @code char } array argument .
2007-12-01 00:00:00 +00:00
* < p >
2012-01-23 12:17:30 -08:00
* The { @code offset } argument is the index of the first
* character of the subarray . The { @code count } argument
2007-12-01 00:00:00 +00:00
* specifies the length of the subarray . The contents of the subarray
* are copied ; subsequent modification of the character array does not
* affect the newly created string .
*
* @param data the character array .
* @param offset the initial offset into the value of the
2012-01-23 12:17:30 -08:00
* { @code String } .
* @param count the length of the value of the { @code String } .
2007-12-01 00:00:00 +00:00
* @return a string representing the sequence of characters contained
* in the subarray of the character array argument .
2012-01-23 12:17:30 -08:00
* @exception IndexOutOfBoundsException if { @code offset } is
* negative , or { @code count } is negative , or
* { @code offset + count } is larger than
* { @code data . length } .
2007-12-01 00:00:00 +00:00
* /
public static String valueOf ( char data [ ] , int offset , int count ) {
return new String ( data , offset , count ) ;
}
/ * *
* Returns a String that represents the character sequence in the
* array specified .
*
* @param data the character array .
* @param offset initial offset of the subarray .
* @param count length of the subarray .
2012-01-23 12:17:30 -08:00
* @return a { @code String } that contains the characters of the
2007-12-01 00:00:00 +00:00
* specified subarray of the character array .
* /
public static String copyValueOf ( char data [ ] , int offset , int count ) {
// All public String constructors now copy the data.
return new String ( data , offset , count ) ;
}
/ * *
* Returns a String that represents the character sequence in the
* array specified .
*
* @param data the character array .
2012-01-23 12:17:30 -08:00
* @return a { @code String } that contains the characters of the
2007-12-01 00:00:00 +00:00
* character array .
* /
public static String copyValueOf ( char data [ ] ) {
2012-05-17 10:06:19 -07:00
return new String ( data ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code boolean } argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param b a { @code boolean } .
* @return if the argument is { @code true } , a string equal to
* { @code " true " } is returned ; otherwise , a string equal to
* { @code " false " } is returned .
2007-12-01 00:00:00 +00:00
* /
public static String valueOf ( boolean b ) {
return b ? " true " : " false " ;
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code char }
2007-12-01 00:00:00 +00:00
* argument .
*
2012-01-23 12:17:30 -08:00
* @param c a { @code char } .
* @return a string of length { @code 1 } containing
* as its single character the argument { @code c } .
2007-12-01 00:00:00 +00:00
* /
public static String valueOf ( char c ) {
char data [ ] = { c } ;
2012-05-17 10:06:19 -07:00
return new String ( data , true ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code int } argument .
2007-12-01 00:00:00 +00:00
* < p >
* The representation is exactly the one returned by the
2012-01-23 12:17:30 -08:00
* { @code Integer . toString } method of one argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param i an { @code int } .
* @return a string representation of the { @code int } argument .
2007-12-01 00:00:00 +00:00
* @see java . lang . Integer # toString ( int , int )
* /
public static String valueOf ( int i ) {
2009-10-07 14:04:20 -07:00
return Integer . toString ( i ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code long } argument .
2007-12-01 00:00:00 +00:00
* < p >
* The representation is exactly the one returned by the
2012-01-23 12:17:30 -08:00
* { @code Long . toString } method of one argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param l a { @code long } .
* @return a string representation of the { @code long } argument .
2007-12-01 00:00:00 +00:00
* @see java . lang . Long # toString ( long )
* /
public static String valueOf ( long l ) {
2009-10-07 14:04:20 -07:00
return Long . toString ( l ) ;
2007-12-01 00:00:00 +00:00
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code float } argument .
2007-12-01 00:00:00 +00:00
* < p >
* The representation is exactly the one returned by the
2012-01-23 12:17:30 -08:00
* { @code Float . toString } method of one argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param f a { @code float } .
* @return a string representation of the { @code float } argument .
2007-12-01 00:00:00 +00:00
* @see java . lang . Float # toString ( float )
* /
public static String valueOf ( float f ) {
return Float . toString ( f ) ;
}
/ * *
2012-01-23 12:17:30 -08:00
* Returns the string representation of the { @code double } argument .
2007-12-01 00:00:00 +00:00
* < p >
* The representation is exactly the one returned by the
2012-01-23 12:17:30 -08:00
* { @code Double . toString } method of one argument .
2007-12-01 00:00:00 +00:00
*
2012-01-23 12:17:30 -08:00
* @param d a { @code double } .
* @return a string representation of the { @code double } argument .
2007-12-01 00:00:00 +00:00
* @see java . lang . Double # toString ( double )
* /
public static String valueOf ( double d ) {
return Double . toString ( d ) ;
}
/ * *
* Returns a canonical representation for the string object .
* < p >
* A pool of strings , initially empty , is maintained privately by the
2012-01-23 12:17:30 -08:00
* class { @ code String } .
2007-12-01 00:00:00 +00:00
* < p >
* When the intern method is invoked , if the pool already contains a
2012-01-23 12:17:30 -08:00
* string equal to this { @code String } object as determined by
2007-12-01 00:00:00 +00:00
* the { @link # equals ( Object ) } method , then the string from the pool is
2012-01-23 12:17:30 -08:00
* returned . Otherwise , this { @code String } object is added to the
* pool and a reference to this { @code String } object is returned .
2007-12-01 00:00:00 +00:00
* < p >
2012-01-23 12:17:30 -08:00
* It follows that for any two strings { @code s } and { @code t } ,
* { @code s . intern ( ) = = t . intern ( ) } is { @code true }
* if and only if { @code s . equals ( t ) } is { @code true } .
2007-12-01 00:00:00 +00:00
* < p >
* All literal strings and string - valued constant expressions are
2011-04-13 12:16:13 -07:00
* interned . String literals are defined in section 3 . 10 . 5 of the
* < cite > The Java & trade ; Language Specification < / cite > .
2007-12-01 00:00:00 +00:00
*
* @return a string that has the same contents as this string , but is
* guaranteed to be from a pool of unique strings .
* /
public native String intern ( ) ;
}