• String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别


    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法。

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01.html

    更多内容请参考:

    1. StringBuilder 详解 (String系列之2)

    2. StringBuffer 详解 (String系列之3)

    String 简介

    String 是java中的字符串,它继承于CharSequence。
    String类所包含的API接口非常多。为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序。

    String 和 CharSequence 关系
    String 继承于CharSequence,也就是说String也是CharSequence类型。
    CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
    需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!

    StringBuilder StringBuffer 的区别

    StringBuilder StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。
    但是,StringBuilder是非线程安全的,而StringBuffer是线程安全的

    它们之间的关系图如下:

    更多关于“StringBuilder”的内容,请参考:http://www.cnblogs.com/skywang12345/p/string02.html

    更多关于“StringBuffer”的内容,请参考  :http://www.cnblogs.com/skywang12345/p/string03.html

    String 函数列表 

    复制代码
    public    String()
    public    String(String original)
    public    String(char[] value)
    public    String(char[] value, int offset, int count)
    public    String(byte[] bytes)
    public    String(byte[] bytes, int offset, int length)
    public    String(byte[] ascii, int hibyte)
    public    String(byte[] ascii, int hibyte, int offset, int count)
    public    String(byte[] bytes, String charsetName)
    public    String(byte[] bytes, int offset, int length, String charsetName)
    public    String(byte[] bytes, Charset charset)
    public    String(byte[] bytes, int offset, int length, Charset charset)
    public    String(int[] codePoints, int offset, int count)
    public    String(StringBuffer buffer)
    public    String(StringBuilder builder)
    

    public char charAt(int index)
    public int codePointAt(int index)
    public int codePointBefore(int index)
    public int codePointCount(int beginIndex, int endIndex)
    public int compareTo(String anotherString)
    public int compareToIgnoreCase(String str)
    public String concat(String str)
    public boolean contains(CharSequence s)
    public boolean contentEquals(StringBuffer sb)
    public boolean contentEquals(CharSequence cs)
    public static String copyValueOf(char[] data, int offset, int count)
    public static String copyValueOf(char[] data)
    public boolean endsWith(String suffix)
    public boolean equals(Object anObject)
    public boolean equalsIgnoreCase(String anotherString)
    public static String format(String format, Object[] args)
    public static String format(Locale l, String format, Object[] args)
    public int hashCode()
    public int indexOf(int ch)
    public int indexOf(int ch, int fromIndex)
    public int indexOf(String str)
    public int indexOf(String str, int fromIndex)
    public String intern()
    public int lastIndexOf(int ch)
    public int lastIndexOf(int ch, int fromIndex)
    public int lastIndexOf(String str)
    public int lastIndexOf(String str, int fromIndex)
    public int length()
    public boolean matches(String regex)
    public int offsetByCodePoints(int index, int codePointOffset)
    public boolean regionMatches(int toffset, String other, int ooffset, int len)
    public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
    public String replace(char oldChar, char newChar)
    public String replace(CharSequence target, CharSequence replacement)
    public String replaceAll(String regex, String replacement)
    public String replaceFirst(String regex, String replacement)
    public String[] split(String regex, int limit)
    public String[] split(String regex)
    public boolean startsWith(String prefix, int toffset)
    public boolean startsWith(String prefix)
    public CharSequence subSequence(int beginIndex, int endIndex)
    public String substring(int beginIndex)
    public String substring(int beginIndex, int endIndex)
    public char[] toCharArray()
    public String toLowerCase(Locale locale)
    public String toLowerCase()
    public String toString()
    public String toUpperCase(Locale locale)
    public String toUpperCase()
    public String trim()
    public static String valueOf(Object obj)
    public static String valueOf(char[] data)
    public static String valueOf(char[] data, int offset, int count)
    public static String valueOf(boolean b)
    public static String valueOf(char c)
    public static String valueOf(int i)
    public static String valueOf(long l)
    public static String valueOf(float f)
    public static String valueOf(double d)
    public void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)
    public byte[] getBytes(String charsetName)
    public byte[] getBytes(Charset charset)
    public byte[] getBytes()
    public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
    public boolean isEmpty()

    复制代码

    CharSequence和String源码

    1. CharSequence源码(基于jdk1.7.40)

     1 package java.lang;
     2 
     3 public interface CharSequence {
     4 
     5     int length();
     6 
     7     char charAt(int index);
     8 
     9     CharSequence subSequence(int start, int end);
    10 
    11     public String toString();
    12 }
    View Code

    2. String.java源码(基于jdk1.7.40)

       1 package java.lang;
       2 
       3 import java.io.ObjectStreamField;
       4 import java.io.UnsupportedEncodingException;
       5 import java.nio.charset.Charset;
       6 import java.util.ArrayList;
       7 import java.util.Arrays;
       8 import java.util.Comparator;
       9 import java.util.Formatter;
      10 import java.util.Locale;
      11 import java.util.regex.Matcher;
      12 import java.util.regex.Pattern;
      13 import java.util.regex.PatternSyntaxException;
      14 
      15 public final class String
      16     implements java.io.Serializable, Comparable<String>, CharSequence {
      17     private final char value[];
      18 
      19     private int hash;
      20 
      21     private static final long serialVersionUID = -6849794470754667710L;
      22 
      23     private static final ObjectStreamField[] serialPersistentFields =
      24             new ObjectStreamField[0];
      25 
      26     public String() {
      27         this.value = new char[0];
      28     }
      29 
      30     public String(String original) {
      31         this.value = original.value;
      32         this.hash = original.hash;
      33     }
      34 
      35     public String(char value[]) {
      36         this.value = Arrays.copyOf(value, value.length);
      37     }
      38 
      39     public String(char value[], int offset, int count) {
      40         if (offset < 0) {
      41             throw new StringIndexOutOfBoundsException(offset);
      42         }
      43         if (count < 0) {
      44             throw new StringIndexOutOfBoundsException(count);
      45         }
      46         // Note: offset or count might be near -1>>>1.
      47         if (offset > value.length - count) {
      48             throw new StringIndexOutOfBoundsException(offset + count);
      49         }
      50         this.value = Arrays.copyOfRange(value, offset, offset+count);
      51     }
      52 
      53     public String(int[] codePoints, int offset, int count) {
      54         if (offset < 0) {
      55             throw new StringIndexOutOfBoundsException(offset);
      56         }
      57         if (count < 0) {
      58             throw new StringIndexOutOfBoundsException(count);
      59         }
      60         // Note: offset or count might be near -1>>>1.
      61         if (offset > codePoints.length - count) {
      62             throw new StringIndexOutOfBoundsException(offset + count);
      63         }
      64 
      65         final int end = offset + count;
      66 
      67         // Pass 1: Compute precise size of char[]
      68         int n = count;
      69         for (int i = offset; i < end; i++) {
      70             int c = codePoints[i];
      71             if (Character.isBmpCodePoint(c))
      72                 continue;
      73             else if (Character.isValidCodePoint(c))
      74                 n++;
      75             else throw new IllegalArgumentException(Integer.toString(c));
      76         }
      77 
      78         // Pass 2: Allocate and fill in char[]
      79         final char[] v = new char[n];
      80 
      81         for (int i = offset, j = 0; i < end; i++, j++) {
      82             int c = codePoints[i];
      83             if (Character.isBmpCodePoint(c))
      84                 v[j] = (char)c;
      85             else
      86                 Character.toSurrogates(c, v, j++);
      87         }
      88 
      89         this.value = v;
      90     }
      91 
      92     @Deprecated
      93     public String(byte ascii[], int hibyte, int offset, int count) {
      94         checkBounds(ascii, offset, count);
      95         char value[] = new char[count];
      96 
      97         if (hibyte == 0) {
      98             for (int i = count; i-- > 0;) {
      99                 value[i] = (char)(ascii[i + offset] & 0xff);
     100             }
     101         } else {
     102             hibyte <<= 8;
     103             for (int i = count; i-- > 0;) {
     104                 value[i] = (char)(hibyte | (ascii[i + offset] & 0xff));
     105             }
     106         }
     107         this.value = value;
     108     }
     109 
     110     @Deprecated
     111     public String(byte ascii[], int hibyte) {
     112         this(ascii, hibyte, 0, ascii.length);
     113     }
     114 
     115      private static void checkBounds(byte[] bytes, int offset, int length) {
     116         if (length < 0)
     117             throw new StringIndexOutOfBoundsException(length);
     118         if (offset < 0)
     119             throw new StringIndexOutOfBoundsException(offset);
     120         if (offset > bytes.length - length)
     121             throw new StringIndexOutOfBoundsException(offset + length);
     122     }
     123 
     124     public String(byte bytes[], int offset, int length, String charsetName)
     125             throws UnsupportedEncodingException {
     126         if (charsetName == null)
     127             throw new NullPointerException("charsetName");
     128         checkBounds(bytes, offset, length);
     129         this.value = StringCoding.decode(charsetName, bytes, offset, length);
     130     }
     131 
     132     public String(byte bytes[], int offset, int length, Charset charset) {
     133         if (charset == null)
     134             throw new NullPointerException("charset");
     135         checkBounds(bytes, offset, length);
     136         this.value =  StringCoding.decode(charset, bytes, offset, length);
     137     }
     138 
     139     public String(byte bytes[], String charsetName)
     140             throws UnsupportedEncodingException {
     141         this(bytes, 0, bytes.length, charsetName);
     142     }
     143 
     144     public String(byte bytes[], Charset charset) {
     145         this(bytes, 0, bytes.length, charset);
     146     }
     147 
     148     public String(byte bytes[], int offset, int length) {
     149         checkBounds(bytes, offset, length);
     150         this.value = StringCoding.decode(bytes, offset, length);
     151     }
     152 
     153     public String(byte bytes[]) {
     154         this(bytes, 0, bytes.length);
     155     }
     156 
     157     public String(StringBuffer buffer) {
     158         synchronized(buffer) {
     159             this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
     160         }
     161     }
     162 
     163     public String(StringBuilder builder) {
     164         this.value = Arrays.copyOf(builder.getValue(), builder.length());
     165     }
     166 
     167     String(char[] value, boolean share) {
     168         // assert share : "unshared not supported";
     169         this.value = value;
     170     }
     171 
     172     @Deprecated
     173     String(int offset, int count, char[] value) {
     174         this(value, offset, count);
     175     }
     176 
     177     public int length() {
     178         return value.length;
     179     }
     180 
     181     public boolean isEmpty() {
     182         return value.length == 0;
     183     }
     184 
     185     public char charAt(int index) {
     186         if ((index < 0) || (index >= value.length)) {
     187             throw new StringIndexOutOfBoundsException(index);
     188         }
     189         return value[index];
     190     }
     191 
     192     public int codePointAt(int index) {
     193         if ((index < 0) || (index >= value.length)) {
     194             throw new StringIndexOutOfBoundsException(index);
     195         }
     196         return Character.codePointAtImpl(value, index, value.length);
     197     }
     198 
     199     public int codePointBefore(int index) {
     200         int i = index - 1;
     201         if ((i < 0) || (i >= value.length)) {
     202             throw new StringIndexOutOfBoundsException(index);
     203         }
     204         return Character.codePointBeforeImpl(value, index, 0);
     205     }
     206 
     207     public int codePointCount(int beginIndex, int endIndex) {
     208         if (beginIndex < 0 || endIndex > value.length || beginIndex > endIndex) {
     209             throw new IndexOutOfBoundsException();
     210         }
     211         return Character.codePointCountImpl(value, beginIndex, endIndex - beginIndex);
     212     }
     213 
     214     public int offsetByCodePoints(int index, int codePointOffset) {
     215         if (index < 0 || index > value.length) {
     216             throw new IndexOutOfBoundsException();
     217         }
     218         return Character.offsetByCodePointsImpl(value, 0, value.length,
     219                 index, codePointOffset);
     220     }
     221 
     222     void getChars(char dst[], int dstBegin) {
     223         System.arraycopy(value, 0, dst, dstBegin, value.length);
     224     }
     225 
     226     public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
     227         if (srcBegin < 0) {
     228             throw new StringIndexOutOfBoundsException(srcBegin);
     229         }
     230         if (srcEnd > value.length) {
     231             throw new StringIndexOutOfBoundsException(srcEnd);
     232         }
     233         if (srcBegin > srcEnd) {
     234             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
     235         }
     236         System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
     237     }
     238 
     239     @Deprecated
     240     public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
     241         if (srcBegin < 0) {
     242             throw new StringIndexOutOfBoundsException(srcBegin);
     243         }
     244         if (srcEnd > value.length) {
     245             throw new StringIndexOutOfBoundsException(srcEnd);
     246         }
     247         if (srcBegin > srcEnd) {
     248             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
     249         }
     250         int j = dstBegin;
     251         int n = srcEnd;
     252         int i = srcBegin;
     253         char[] val = value;   /* avoid getfield opcode */
     254 
     255         while (i < n) {
     256             dst[j++] = (byte)val[i++];
     257         }
     258     }
     259 
     260     public byte[] getBytes(String charsetName)
     261             throws UnsupportedEncodingException {
     262         if (charsetName == null) throw new NullPointerException();
     263         return StringCoding.encode(charsetName, value, 0, value.length);
     264     }
     265 
     266     public byte[] getBytes(Charset charset) {
     267         if (charset == null) throw new NullPointerException();
     268         return StringCoding.encode(charset, value, 0, value.length);
     269     }
     270 
     271     public byte[] getBytes() {
     272         return StringCoding.encode(value, 0, value.length);
     273     }
     274 
     275     public boolean equals(Object anObject) {
     276         if (this == anObject) {
     277             return true;
     278         }
     279         if (anObject instanceof String) {
     280             String anotherString = (String) anObject;
     281             int n = value.length;
     282             if (n == anotherString.value.length) {
     283                 char v1[] = value;
     284                 char v2[] = anotherString.value;
     285                 int i = 0;
     286                 while (n-- != 0) {
     287                     if (v1[i] != v2[i])
     288                             return false;
     289                     i++;
     290                 }
     291                 return true;
     292             }
     293         }
     294         return false;
     295     }
     296 
     297     public boolean contentEquals(StringBuffer sb) {
     298         synchronized (sb) {
     299             return contentEquals((CharSequence) sb);
     300         }
     301     }
     302 
     303     public boolean contentEquals(CharSequence cs) {
     304         if (value.length != cs.length())
     305             return false;
     306         // Argument is a StringBuffer, StringBuilder
     307         if (cs instanceof AbstractStringBuilder) {
     308             char v1[] = value;
     309             char v2[] = ((AbstractStringBuilder) cs).getValue();
     310             int i = 0;
     311             int n = value.length;
     312             while (n-- != 0) {
     313                 if (v1[i] != v2[i])
     314                     return false;
     315                 i++;
     316             }
     317             return true;
     318         }
     319         // Argument is a String
     320         if (cs.equals(this))
     321             return true;
     322         // Argument is a generic CharSequence
     323         char v1[] = value;
     324         int i = 0;
     325         int n = value.length;
     326         while (n-- != 0) {
     327             if (v1[i] != cs.charAt(i))
     328                 return false;
     329             i++;
     330         }
     331         return true;
     332     }
     333 
     334     public boolean equalsIgnoreCase(String anotherString) {
     335         return (this == anotherString) ? true
     336                 : (anotherString != null)
     337                 && (anotherString.value.length == value.length)
     338                 && regionMatches(true, 0, anotherString, 0, value.length);
     339     }
     340 
     341     public int compareTo(String anotherString) {
     342         int len1 = value.length;
     343         int len2 = anotherString.value.length;
     344         int lim = Math.min(len1, len2);
     345         char v1[] = value;
     346         char v2[] = anotherString.value;
     347 
     348         int k = 0;
     349         while (k < lim) {
     350             char c1 = v1[k];
     351             char c2 = v2[k];
     352             if (c1 != c2) {
     353                 return c1 - c2;
     354             }
     355             k++;
     356         }
     357         return len1 - len2;
     358     }
     359 
     360     public static final Comparator<String> CASE_INSENSITIVE_ORDER
     361                                          = new CaseInsensitiveComparator();
     362     private static class CaseInsensitiveComparator
     363             implements Comparator<String>, java.io.Serializable {
     364         // use serialVersionUID from JDK 1.2.2 for interoperability
     365         private static final long serialVersionUID = 8575799808933029326L;
     366 
     367         public int compare(String s1, String s2) {
     368             int n1 = s1.length();
     369             int n2 = s2.length();
     370             int min = Math.min(n1, n2);
     371             for (int i = 0; i < min; i++) {
     372                 char c1 = s1.charAt(i);
     373                 char c2 = s2.charAt(i);
     374                 if (c1 != c2) {
     375                     c1 = Character.toUpperCase(c1);
     376                     c2 = Character.toUpperCase(c2);
     377                     if (c1 != c2) {
     378                         c1 = Character.toLowerCase(c1);
     379                         c2 = Character.toLowerCase(c2);
     380                         if (c1 != c2) {
     381                             // No overflow because of numeric promotion
     382                             return c1 - c2;
     383                         }
     384                     }
     385                 }
     386             }
     387             return n1 - n2;
     388         }
     389     }
     390 
     391     public int compareToIgnoreCase(String str) {
     392         return CASE_INSENSITIVE_ORDER.compare(this, str);
     393     }
     394 
     395     public boolean regionMatches(int toffset, String other, int ooffset,
     396             int len) {
     397         char ta[] = value;
     398         int to = toffset;
     399         char pa[] = other.value;
     400         int po = ooffset;
     401         // Note: toffset, ooffset, or len might be near -1>>>1.
     402         if ((ooffset < 0) || (toffset < 0)
     403                 || (toffset > (long)value.length - len)
     404                 || (ooffset > (long)other.value.length - len)) {
     405             return false;
     406         }
     407         while (len-- > 0) {
     408             if (ta[to++] != pa[po++]) {
     409                 return false;
     410             }
     411         }
     412         return true;
     413     }
     414 
     415     public boolean regionMatches(boolean ignoreCase, int toffset,
     416             String other, int ooffset, int len) {
     417         char ta[] = value;
     418         int to = toffset;
     419         char pa[] = other.value;
     420         int po = ooffset;
     421         // Note: toffset, ooffset, or len might be near -1>>>1.
     422         if ((ooffset < 0) || (toffset < 0)
     423                 || (toffset > (long)value.length - len)
     424                 || (ooffset > (long)other.value.length - len)) {
     425             return false;
     426         }
     427         while (len-- > 0) {
     428             char c1 = ta[to++];
     429             char c2 = pa[po++];
     430             if (c1 == c2) {
     431                 continue;
     432             }
     433             if (ignoreCase) {
     434                 // If characters don't match but case may be ignored,
     435                 // try converting both characters to uppercase.
     436                 // If the results match, then the comparison scan should
     437                 // continue.
     438                 char u1 = Character.toUpperCase(c1);
     439                 char u2 = Character.toUpperCase(c2);
     440                 if (u1 == u2) {
     441                     continue;
     442                 }
     443                 // Unfortunately, conversion to uppercase does not work properly
     444                 // for the Georgian alphabet, which has strange rules about case
     445                 // conversion.  So we need to make one last check before
     446                 // exiting.
     447                 if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
     448                     continue;
     449                 }
     450             }
     451             return false;
     452         }
     453         return true;
     454     }
     455 
     456     public boolean startsWith(String prefix, int toffset) {
     457         char ta[] = value;
     458         int to = toffset;
     459         char pa[] = prefix.value;
     460         int po = 0;
     461         int pc = prefix.value.length;
     462         // Note: toffset might be near -1>>>1.
     463         if ((toffset < 0) || (toffset > value.length - pc)) {
     464             return false;
     465         }
     466         while (--pc >= 0) {
     467             if (ta[to++] != pa[po++]) {
     468                 return false;
     469             }
     470         }
     471         return true;
     472     }
     473 
     474     public boolean startsWith(String prefix) {
     475         return startsWith(prefix, 0);
     476     }
     477 
     478     public boolean endsWith(String suffix) {
     479         return startsWith(suffix, value.length - suffix.value.length);
     480     }
     481 
     482     public int hashCode() {
     483         int h = hash;
     484         if (h == 0 && value.length > 0) {
     485             char val[] = value;
     486 
     487             for (int i = 0; i < value.length; i++) {
     488                 h = 31 * h + val[i];
     489             }
     490             hash = h;
     491         }
     492         return h;
     493     }
     494 
     495     public int indexOf(int ch) {
     496         return indexOf(ch, 0);
     497     }
     498 
     499     public int indexOf(int ch, int fromIndex) {
     500         final int max = value.length;
     501         if (fromIndex < 0) {
     502             fromIndex = 0;
     503         } else if (fromIndex >= max) {
     504             // Note: fromIndex might be near -1>>>1.
     505             return -1;
     506         }
     507 
     508         if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
     509             // handle most cases here (ch is a BMP code point or a
     510             // negative value (invalid code point))
     511             final char[] value = this.value;
     512             for (int i = fromIndex; i < max; i++) {
     513                 if (value[i] == ch) {
     514                     return i;
     515                 }
     516             }
     517             return -1;
     518         } else {
     519             return indexOfSupplementary(ch, fromIndex);
     520         }
     521     }
     522 
     523     private int indexOfSupplementary(int ch, int fromIndex) {
     524         if (Character.isValidCodePoint(ch)) {
     525             final char[] value = this.value;
     526             final char hi = Character.highSurrogate(ch);
     527             final char lo = Character.lowSurrogate(ch);
     528             final int max = value.length - 1;
     529             for (int i = fromIndex; i < max; i++) {
     530                 if (value[i] == hi && value[i + 1] == lo) {
     531                     return i;
     532                 }
     533             }
     534         }
     535         return -1;
     536     }
     537 
     538     public int lastIndexOf(int ch) {
     539         return lastIndexOf(ch, value.length - 1);
     540     }
     541 
     542     public int lastIndexOf(int ch, int fromIndex) {
     543         if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
     544             // handle most cases here (ch is a BMP code point or a
     545             // negative value (invalid code point))
     546             final char[] value = this.value;
     547             int i = Math.min(fromIndex, value.length - 1);
     548             for (; i >= 0; i--) {
     549                 if (value[i] == ch) {
     550                     return i;
     551                 }
     552             }
     553             return -1;
     554         } else {
     555             return lastIndexOfSupplementary(ch, fromIndex);
     556         }
     557     }
     558 
     559     private int lastIndexOfSupplementary(int ch, int fromIndex) {
     560         if (Character.isValidCodePoint(ch)) {
     561             final char[] value = this.value;
     562             char hi = Character.highSurrogate(ch);
     563             char lo = Character.lowSurrogate(ch);
     564             int i = Math.min(fromIndex, value.length - 2);
     565             for (; i >= 0; i--) {
     566                 if (value[i] == hi && value[i + 1] == lo) {
     567                     return i;
     568                 }
     569             }
     570         }
     571         return -1;
     572     }
     573 
     574     public int indexOf(String str) {
     575         return indexOf(str, 0);
     576     }
     577 
     578     public int indexOf(String str, int fromIndex) {
     579         return indexOf(value, 0, value.length,
     580                 str.value, 0, str.value.length, fromIndex);
     581     }
     582 
     583     static int indexOf(char[] source, int sourceOffset, int sourceCount,
     584             char[] target, int targetOffset, int targetCount,
     585             int fromIndex) {
     586         if (fromIndex >= sourceCount) {
     587             return (targetCount == 0 ? sourceCount : -1);
     588         }
     589         if (fromIndex < 0) {
     590             fromIndex = 0;
     591         }
     592         if (targetCount == 0) {
     593             return fromIndex;
     594         }
     595 
     596         char first = target[targetOffset];
     597         int max = sourceOffset + (sourceCount - targetCount);
     598 
     599         for (int i = sourceOffset + fromIndex; i <= max; i++) {
     600             /* Look for first character. */
     601             if (source[i] != first) {
     602                 while (++i <= max && source[i] != first);
     603             }
     604 
     605             /* Found first character, now look at the rest of v2 */
     606             if (i <= max) {
     607                 int j = i + 1;
     608                 int end = j + targetCount - 1;
     609                 for (int k = targetOffset + 1; j < end && source[j]
     610                         == target[k]; j++, k++);
     611 
     612                 if (j == end) {
     613                     /* Found whole string. */
     614                     return i - sourceOffset;
     615                 }
     616             }
     617         }
     618         return -1;
     619     }
     620 
     621     public int lastIndexOf(String str) {
     622         return lastIndexOf(str, value.length);
     623     }
     624 
     625     public int lastIndexOf(String str, int fromIndex) {
     626         return lastIndexOf(value, 0, value.length,
     627                 str.value, 0, str.value.length, fromIndex);
     628     }
     629 
     630     static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
     631             char[] target, int targetOffset, int targetCount,
     632             int fromIndex) {
     633         /*
     634          * Check arguments; return immediately where possible. For
     635          * consistency, don't check for null str.
     636          */
     637         int rightIndex = sourceCount - targetCount;
     638         if (fromIndex < 0) {
     639             return -1;
     640         }
     641         if (fromIndex > rightIndex) {
     642             fromIndex = rightIndex;
     643         }
     644         /* Empty string always matches. */
     645         if (targetCount == 0) {
     646             return fromIndex;
     647         }
     648 
     649         int strLastIndex = targetOffset + targetCount - 1;
     650         char strLastChar = target[strLastIndex];
     651         int min = sourceOffset + targetCount - 1;
     652         int i = min + fromIndex;
     653 
     654         startSearchForLastChar:
     655         while (true) {
     656             while (i >= min && source[i] != strLastChar) {
     657                 i--;
     658             }
     659             if (i < min) {
     660                 return -1;
     661             }
     662             int j = i - 1;
     663             int start = j - (targetCount - 1);
     664             int k = strLastIndex - 1;
     665 
     666             while (j > start) {
     667                 if (source[j--] != target[k--]) {
     668                     i--;
     669                     continue startSearchForLastChar;
     670                 }
     671             }
     672             return start - sourceOffset + 1;
     673         }
     674     }
     675 
     676     public String substring(int beginIndex) {
     677         if (beginIndex < 0) {
     678             throw new StringIndexOutOfBoundsException(beginIndex);
     679         }
     680         int subLen = value.length - beginIndex;
     681         if (subLen < 0) {
     682             throw new StringIndexOutOfBoundsException(subLen);
     683         }
     684         return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
     685     }
     686 
     687     public String substring(int beginIndex, int endIndex) {
     688         if (beginIndex < 0) {
     689             throw new StringIndexOutOfBoundsException(beginIndex);
     690         }
     691         if (endIndex > value.length) {
     692             throw new StringIndexOutOfBoundsException(endIndex);
     693         }
     694         int subLen = endIndex - beginIndex;
     695         if (subLen < 0) {
     696             throw new StringIndexOutOfBoundsException(subLen);
     697         }
     698         return ((beginIndex == 0) && (endIndex == value.length)) ? this
     699                 : new String(value, beginIndex, subLen);
     700     }
     701 
     702     public CharSequence subSequence(int beginIndex, int endIndex) {
     703         return this.substring(beginIndex, endIndex);
     704     }
     705 
     706     public String concat(String str) {
     707         int otherLen = str.length();
     708         if (otherLen == 0) {
     709             return this;
     710         }
     711         int len = value.length;
     712         char buf[] = Arrays.copyOf(value, len + otherLen);
     713         str.getChars(buf, len);
     714         return new String(buf, true);
     715     }
     716 
     717     public String replace(char oldChar, char newChar) {
     718         if (oldChar != newChar) {
     719             int len = value.length;
     720             int i = -1;
     721             char[] val = value; /* avoid getfield opcode */
     722 
     723             while (++i < len) {
     724                 if (val[i] == oldChar) {
     725                     break;
     726                 }
     727             }
     728             if (i < len) {
     729                 char buf[] = new char[len];
     730                 for (int j = 0; j < i; j++) {
     731                     buf[j] = val[j];
     732                 }
     733                 while (i < len) {
     734                     char c = val[i];
     735                     buf[i] = (c == oldChar) ? newChar : c;
     736                     i++;
     737                 }
     738                 return new String(buf, true);
     739             }
     740         }
     741         return this;
     742     }
     743 
     744     public boolean matches(String regex) {
     745         return Pattern.matches(regex, this);
     746     }
     747 
     748     public boolean contains(CharSequence s) {
     749         return indexOf(s.toString()) > -1;
     750     }
     751 
     752     public String replaceFirst(String regex, String replacement) {
     753         return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
     754     }
     755 
     756     public String replaceAll(String regex, String replacement) {
     757         return Pattern.compile(regex).matcher(this).replaceAll(replacement);
     758     }
     759 
     760     public String replace(CharSequence target, CharSequence replacement) {
     761         return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
     762                 this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
     763     }
     764 
     765     public String[] split(String regex, int limit) {
     766         /* fastpath if the regex is a
     767          (1)one-char String and this character is not one of the
     768             RegEx's meta characters ".$|()[{^?*+\", or
     769          (2)two-char String and the first char is the backslash and
     770             the second is not the ascii digit or ascii letter.
     771          */
     772         char ch = 0;
     773         if (((regex.value.length == 1 &&
     774              ".$|()[{^?*+\".indexOf(ch = regex.charAt(0)) == -1) ||
     775              (regex.length() == 2 &&
     776               regex.charAt(0) == '\' &&
     777               (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
     778               ((ch-'a')|('z'-ch)) < 0 &&
     779               ((ch-'A')|('Z'-ch)) < 0)) &&
     780             (ch < Character.MIN_HIGH_SURROGATE ||
     781              ch > Character.MAX_LOW_SURROGATE))
     782         {
     783             int off = 0;
     784             int next = 0;
     785             boolean limited = limit > 0;
     786             ArrayList<String> list = new ArrayList<>();
     787             while ((next = indexOf(ch, off)) != -1) {
     788                 if (!limited || list.size() < limit - 1) {
     789                     list.add(substring(off, next));
     790                     off = next + 1;
     791                 } else {    // last one
     792                     //assert (list.size() == limit - 1);
     793                     list.add(substring(off, value.length));
     794                     off = value.length;
     795                     break;
     796                 }
     797             }
     798             // If no match was found, return this
     799             if (off == 0)
     800                 return new String[]{this};
     801 
     802             // Add remaining segment
     803             if (!limited || list.size() < limit)
     804                 list.add(substring(off, value.length));
     805 
     806             // Construct result
     807             int resultSize = list.size();
     808             if (limit == 0)
     809                 while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
     810                     resultSize--;
     811             String[] result = new String[resultSize];
     812             return list.subList(0, resultSize).toArray(result);
     813         }
     814         return Pattern.compile(regex).split(this, limit);
     815     }
     816 
     817     public String[] split(String regex) {
     818         return split(regex, 0);
     819     }
     820 
     821     public String toLowerCase(Locale locale) {
     822         if (locale == null) {
     823             throw new NullPointerException();
     824         }
     825 
     826         int firstUpper;
     827         final int len = value.length;
     828 
     829         /* Now check if there are any characters that need to be changed. */
     830         scan: {
     831             for (firstUpper = 0 ; firstUpper < len; ) {
     832                 char c = value[firstUpper];
     833                 if ((c >= Character.MIN_HIGH_SURROGATE)
     834                         && (c <= Character.MAX_HIGH_SURROGATE)) {
     835                     int supplChar = codePointAt(firstUpper);
     836                     if (supplChar != Character.toLowerCase(supplChar)) {
     837                         break scan;
     838                     }
     839                     firstUpper += Character.charCount(supplChar);
     840                 } else {
     841                     if (c != Character.toLowerCase(c)) {
     842                         break scan;
     843                     }
     844                     firstUpper++;
     845                 }
     846             }
     847             return this;
     848         }
     849 
     850         char[] result = new char[len];
     851         int resultOffset = 0;  /* result may grow, so i+resultOffset
     852                                 * is the write location in result */
     853 
     854         /* Just copy the first few lowerCase characters. */
     855         System.arraycopy(value, 0, result, 0, firstUpper);
     856 
     857         String lang = locale.getLanguage();
     858         boolean localeDependent =
     859                 (lang == "tr" || lang == "az" || lang == "lt");
     860         char[] lowerCharArray;
     861         int lowerChar;
     862         int srcChar;
     863         int srcCount;
     864         for (int i = firstUpper; i < len; i += srcCount) {
     865             srcChar = (int)value[i];
     866             if ((char)srcChar >= Character.MIN_HIGH_SURROGATE
     867                     && (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
     868                 srcChar = codePointAt(i);
     869                 srcCount = Character.charCount(srcChar);
     870             } else {
     871                 srcCount = 1;
     872             }
     873             if (localeDependent || srcChar == 'u03A3') { // GREEK CAPITAL LETTER SIGMA
     874                 lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
     875             } else if (srcChar == 'u0130') { // LATIN CAPITAL LETTER I DOT
     876                 lowerChar = Character.ERROR;
     877             } else {
     878                 lowerChar = Character.toLowerCase(srcChar);
     879             }
     880             if ((lowerChar == Character.ERROR)
     881                     || (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
     882                 if (lowerChar == Character.ERROR) {
     883                     if (!localeDependent && srcChar == 'u0130') {
     884                         lowerCharArray =
     885                                 ConditionalSpecialCasing.toLowerCaseCharArray(this, i, Locale.ENGLISH);
     886                     } else {
     887                         lowerCharArray =
     888                                 ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
     889                     }
     890                 } else if (srcCount == 2) {
     891                     resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
     892                     continue;
     893                 } else {
     894                     lowerCharArray = Character.toChars(lowerChar);
     895                 }
     896 
     897                 /* Grow result if needed */
     898                 int mapLen = lowerCharArray.length;
     899                 if (mapLen > srcCount) {
     900                     char[] result2 = new char[result.length + mapLen - srcCount];
     901                     System.arraycopy(result, 0, result2, 0, i + resultOffset);
     902                     result = result2;
     903                 }
     904                 for (int x = 0; x < mapLen; ++x) {
     905                     result[i + resultOffset + x] = lowerCharArray[x];
     906                 }
     907                 resultOffset += (mapLen - srcCount);
     908             } else {
     909                 result[i + resultOffset] = (char)lowerChar;
     910             }
     911         }
     912         return new String(result, 0, len + resultOffset);
     913     }
     914 
     915     public String toLowerCase() {
     916         return toLowerCase(Locale.getDefault());
     917     }
     918 
     919     public String toUpperCase(Locale locale) {
     920         if (locale == null) {
     921             throw new NullPointerException();
     922         }
     923 
     924         int firstLower;
     925         final int len = value.length;
     926 
     927         /* Now check if there are any characters that need to be changed. */
     928         scan: {
     929            for (firstLower = 0 ; firstLower < len; ) {
     930                 int c = (int)value[firstLower];
     931                 int srcCount;
     932                 if ((c >= Character.MIN_HIGH_SURROGATE)
     933                         && (c <= Character.MAX_HIGH_SURROGATE)) {
     934                     c = codePointAt(firstLower);
     935                     srcCount = Character.charCount(c);
     936                 } else {
     937                     srcCount = 1;
     938                 }
     939                 int upperCaseChar = Character.toUpperCaseEx(c);
     940                 if ((upperCaseChar == Character.ERROR)
     941                         || (c != upperCaseChar)) {
     942                     break scan;
     943                 }
     944                 firstLower += srcCount;
     945             }
     946             return this;
     947         }
     948 
     949         char[] result = new char[len]; /* may grow */
     950         int resultOffset = 0;  /* result may grow, so i+resultOffset
     951          * is the write location in result */
     952 
     953         /* Just copy the first few upperCase characters. */
     954         System.arraycopy(value, 0, result, 0, firstLower);
     955 
     956         String lang = locale.getLanguage();
     957         boolean localeDependent =
     958                 (lang == "tr" || lang == "az" || lang == "lt");
     959         char[] upperCharArray;
     960         int upperChar;
     961         int srcChar;
     962         int srcCount;
     963         for (int i = firstLower; i < len; i += srcCount) {
     964             srcChar = (int)value[i];
     965             if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
     966                 (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
     967                 srcChar = codePointAt(i);
     968                 srcCount = Character.charCount(srcChar);
     969             } else {
     970                 srcCount = 1;
     971             }
     972             if (localeDependent) {
     973                 upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale);
     974             } else {
     975                 upperChar = Character.toUpperCaseEx(srcChar);
     976             }
     977             if ((upperChar == Character.ERROR)
     978                     || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
     979                 if (upperChar == Character.ERROR) {
     980                     if (localeDependent) {
     981                         upperCharArray =
     982                                 ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale);
     983                     } else {
     984                         upperCharArray = Character.toUpperCaseCharArray(srcChar);
     985                     }
     986                 } else if (srcCount == 2) {
     987                     resultOffset += Character.toChars(upperChar, result, i + resultOffset) - srcCount;
     988                     continue;
     989                 } else {
     990                     upperCharArray = Character.toChars(upperChar);
     991                 }
     992 
     993                 /* Grow result if needed */
     994                 int mapLen = upperCharArray.length;
     995                 if (mapLen > srcCount) {
     996                     char[] result2 = new char[result.length + mapLen - srcCount];
     997                     System.arraycopy(result, 0, result2, 0, i + resultOffset);
     998                     result = result2;
     999                 }
    1000                 for (int x = 0; x < mapLen; ++x) {
    1001                     result[i + resultOffset + x] = upperCharArray[x];
    1002                 }
    1003                 resultOffset += (mapLen - srcCount);
    1004             } else {
    1005                 result[i + resultOffset] = (char)upperChar;
    1006             }
    1007         }
    1008         return new String(result, 0, len + resultOffset);
    1009     }
    1010 
    1011     public String toUpperCase() {
    1012         return toUpperCase(Locale.getDefault());
    1013     }
    1014 
    1015     public String trim() {
    1016         int len = value.length;
    1017         int st = 0;
    1018         char[] val = value;    /* avoid getfield opcode */
    1019 
    1020         while ((st < len) && (val[st] <= ' ')) {
    1021             st++;
    1022         }
    1023         while ((st < len) && (val[len - 1] <= ' ')) {
    1024             len--;
    1025         }
    1026         return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    1027     }
    1028 
    1029     public String toString() {
    1030         return this;
    1031     }
    1032 
    1033     public char[] toCharArray() {
    1034         // Cannot use Arrays.copyOf because of class initialization order issues
    1035         char result[] = new char[value.length];
    1036         System.arraycopy(value, 0, result, 0, value.length);
    1037         return result;
    1038     }
    1039 
    1040     public static String format(String format, Object... args) {
    1041         return new Formatter().format(format, args).toString();
    1042     }
    1043 
    1044     public static String format(Locale l, String format, Object... args) {
    1045         return new Formatter(l).format(format, args).toString();
    1046     }
    1047 
    1048     public static String valueOf(Object obj) {
    1049         return (obj == null) ? "null" : obj.toString();
    1050     }
    1051 
    1052     public static String valueOf(char data[]) {
    1053         return new String(data);
    1054     }
    1055 
    1056     public static String valueOf(char data[], int offset, int count) {
    1057         return new String(data, offset, count);
    1058     }
    1059 
    1060     public static String copyValueOf(char data[], int offset, int count) {
    1061         // All public String constructors now copy the data.
    1062         return new String(data, offset, count);
    1063     }
    1064 
    1065     public static String copyValueOf(char data[]) {
    1066         return new String(data);
    1067     }
    1068 
    1069     public static String valueOf(boolean b) {
    1070         return b ? "true" : "false";
    1071     }
    1072 
    1073     public static String valueOf(char c) {
    1074         char data[] = {c};
    1075         return new String(data, true);
    1076     }
    1077 
    1078     public static String valueOf(int i) {
    1079         return Integer.toString(i);
    1080     }
    1081 
    1082     public static String valueOf(long l) {
    1083         return Long.toString(l);
    1084     }
    1085 
    1086     public static String valueOf(float f) {
    1087         return Float.toString(f);
    1088     }
    1089 
    1090     public static String valueOf(double d) {
    1091         return Double.toString(d);
    1092     }
    1093 
    1094     public native String intern();
    1095 
    1096     private static final int HASHING_SEED;
    1097 
    1098     static {
    1099         long nanos = System.nanoTime();
    1100         long now = System.currentTimeMillis();
    1101         int SEED_MATERIAL[] = {
    1102                 System.identityHashCode(String.class),
    1103                 System.identityHashCode(System.class),
    1104                 (int) (nanos >>> 32),
    1105                 (int) nanos,
    1106                 (int) (now >>> 32),
    1107                 (int) now,
    1108                 (int) (System.nanoTime() >>> 2)
    1109         };
    1110 
    1111         // Use murmur3 to scramble the seeding material.
    1112         // Inline implementation to avoid loading classes
    1113         int h1 = 0;
    1114 
    1115         // body
    1116         for (int k1 : SEED_MATERIAL) {
    1117             k1 *= 0xcc9e2d51;
    1118             k1 = (k1 << 15) | (k1 >>> 17);
    1119             k1 *= 0x1b873593;
    1120 
    1121             h1 ^= k1;
    1122             h1 = (h1 << 13) | (h1 >>> 19);
    1123             h1 = h1 * 5 + 0xe6546b64;
    1124         }
    1125 
    1126         // tail (always empty, as body is always 32-bit chunks)
    1127 
    1128         // finalization
    1129 
    1130         h1 ^= SEED_MATERIAL.length * 4;
    1131 
    1132         // finalization mix force all bits of a hash block to avalanche
    1133         h1 ^= h1 >>> 16;
    1134         h1 *= 0x85ebca6b;
    1135         h1 ^= h1 >>> 13;
    1136         h1 *= 0xc2b2ae35;
    1137         h1 ^= h1 >>> 16;
    1138 
    1139         HASHING_SEED = h1;
    1140     }
    1141 
    1142     private transient int hash32 = 0;
    1143 
    1144 
    1145     int hash32() {
    1146         int h = hash32;
    1147         if (0 == h) {
    1148            // harmless data race on hash32 here.
    1149            h = sun.misc.Hashing.murmur3_32(HASHING_SEED, value, 0, value.length);
    1150 
    1151            // ensure result is not zero to avoid recalcing
    1152            h = (0 != h) ? h : 1;
    1153 
    1154            hash32 = h;
    1155         }
    1156 
    1157         return h;
    1158     }
    1159 }
    View Code

    说明:String的本质是字符序列,它是通过字符数组实现的!

    演示程序

    1. CharSequence

    下面通过示例,演示CharSequence的使用方法!
    源码如下(CharSequenceTest.java):

    复制代码
     1 /**
     2  * CharSequence 演示程序
     3  *
     4  * @author skywang
     5  */
     6 import java.nio.charset.Charset;
     7 import java.io.UnsupportedEncodingException;
     8 
     9 public class CharSequenceTest {
    10 
    11     public static void main(String[] args) {
    12         testCharSequence();
    13     }
    14 
    15     /**
    16      * CharSequence 测试程序
    17      */
    18     private static void testCharSequence() {
    19         System.out.println("-------------------------------- testCharSequence -----------------------------");
    20 
    21         // 1. CharSequence的子类String
    22         String str = "abcdefghijklmnopqrstuvwxyz";
    23         System.out.println("1. String");
    24         System.out.printf("   %-30s=%d
    ", "str.length()", str.length());
    25         System.out.printf("   %-30s=%c
    ", "str.charAt(5)", str.charAt(5));
    26         String substr = (String)str.subSequence(0,5);
    27         System.out.printf("   %-30s=%s
    ", "str.subSequence(0,5)", substr.toString());
    28 
    29         // 2. CharSequence的子类StringBuilder
    30         StringBuilder strbuilder = new StringBuilder("abcdefghijklmnopqrstuvwxyz");
    31         System.out.println("2. StringBuilder");
    32         System.out.printf("   %-30s=%d
    ", "strbuilder.length()", strbuilder.length());
    33         System.out.printf("   %-30s=%c
    ", "strbuilder.charAt(5)", strbuilder.charAt(5));
    34         // 注意:StringBuilder的subSequence()返回的是,实际上是一个String对象!
    35         String substrbuilder = (String)strbuilder.subSequence(0,5);
    36         System.out.printf("   %-30s=%s
    ", "strbuilder.subSequence(0,5)", substrbuilder.toString());
    37 
    38         // 3. CharSequence的子类StringBuffer
    39         StringBuffer strbuffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
    40         System.out.println("3. StringBuffer");
    41         System.out.printf("   %-30s=%d
    ", "strbuffer.length()", strbuffer.length());
    42         System.out.printf("   %-30s=%c
    ", "strbuffer.charAt(5)", strbuffer.charAt(5));
    43         // 注意:StringBuffer的subSequence()返回的是,实际上是一个String对象!
    44         String substrbuffer = (String)strbuffer.subSequence(0,5);
    45         System.out.printf("   %-30s=%s
    ", "strbuffer.subSequence(0,5)", substrbuffer.toString());
    46 
    47         System.out.println();
    48     }
    49 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testCharSequence -----------------------------
    1. String
       str.length()                  =26
       str.charAt(5)                 =f
       str.subSequence(0,5)          =abcde
    2. StringBuilder
       strbuilder.length()           =26
       strbuilder.charAt(5)          =f
       strbuilder.subSequence(0,5)   =abcde
    3. StringBuffer
       strbuffer.length()            =26
       strbuffer.charAt(5)           =f
       strbuffer.subSequence(0,5)    =abcde
    复制代码

    2. String 构造函数

    下面通过示例,演示String的各种构造函数的使用方法!
    源码如下(StringContructorTest.java):

    复制代码
     1 /**
     2  * String 构造函数演示程序
     3  *
     4  * @author skywang
     5  */
     6 import java.nio.charset.Charset;
     7 import java.io.UnsupportedEncodingException;
     8 
     9 public class StringContructorTest {
    10 
    11     public static void main(String[] args) {
    12         testStringConstructors() ;
    13     }
    14 
    15     /**
    16      * String 构造函数测试程序
    17      */
    18     private static void testStringConstructors() {
    19         try {
    20             System.out.println("-------------------------------- testStringConstructors -----------------------");
    21 
    22             String str01 = new String();
    23             String str02 = new String("String02");
    24             String str03 = new String(new char[]{'s','t','r','0','3'});
    25             String str04 = new String(new char[]{'s','t','r','0','4'}, 1, 3);          // 1表示起始位置,3表示个数
    26             String str05 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65});       // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
    27             String str06 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 1, 3); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
    28             String str07 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0);       // 0x61在ASC表中,对应字符"a";0,表示“高字节”
    29             String str08 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0, 1, 3); // 0x61在ASC表中,对应字符"a"; 0,表示“高字节”;1表示起始位置,3表示长度
    30             String str09 = new String(new byte[]{(byte)0xe5, (byte)0xad, (byte)0x97, /* 字-对应的utf-8编码 */ 
    31                                                  (byte)0xe7, (byte)0xac, (byte)0xa6, /* 符-对应的utf-8编码 */ 
    32                                                  (byte)0xe7, (byte)0xbc, (byte)0x96, /* 编-对应的utf-8编码 */ 
    33                                                  (byte)0xe7, (byte)0xa0, (byte)0x81, /* 码-对应的utf-8编码 */ }, 
    34                                       0, 12, "utf-8");  // 0表示起始位置,12表示长度。
    35             String str10 = new String(new byte[]{(byte)0x5b, (byte)0x57, /* 字-对应的utf-16编码 */ 
    36                                                  (byte)0x7b, (byte)0x26, /* 符-对应的utf-16编码 */ 
    37                                                  (byte)0x7f, (byte)0x16, /* 编-对应的utf-16编码 */ 
    38                                                  (byte)0x78, (byte)0x01, /* 码-对应的utf-16编码 */ }, 
    39                                       0, 8, "utf-16");  // 0表示起始位置,8表示长度。
    40             String str11 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gb2312编码  */ 
    41                                                  (byte)0xb7, (byte)0xfb, /* 符-对应的gb2312编码 */ 
    42                                                  (byte)0xb1, (byte)0xe0, /* 编-对应的gb2312编码 */ 
    43                                                  (byte)0xc2, (byte)0xeb, /* 码-对应的gb2312编码 */ }, 
    44                                       Charset.forName("gb2312")); 
    45             String str12 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gbk编码 */ 
    46                                                  (byte)0xb7, (byte)0xfb, /* 符-对应的gbk编码 */ 
    47                                                  (byte)0xb1, (byte)0xe0, /* 编-对应的gbk编码 */ 
    48                                                  (byte)0xc2, (byte)0xeb, /* 码-对应的gbk编码 */ }, 
    49                                       0, 8, Charset.forName("gbk")); 
    50             String str13 = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4);  // "字符编码"(u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
    51             String str14 = new String(new StringBuffer("StringBuffer"));
    52             String str15 = new String(new StringBuilder("StringBuilder"));
    53 
    54             System.out.printf(" str01=%s 
     str02=%s 
     str03=%s 
     str04=%s 
     str05=%s 
     str06=%s 
     str07=%s 
     str08=%s
     str09=%s
     str10=%s
     str11=%s
     str12=%s
     str13=%s
     str14=%s
     str15=%s
    ",
    55                     str01, str02, str03, str04, str05, str06, str07, str08, str09, str10, str11, str12, str13, str14, str15);
    56 
    57 
    58             System.out.println();
    59         } catch (UnsupportedEncodingException e) {
    60             e.printStackTrace();
    61         }
    62     }
    63 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testStringConstructors -----------------------
     str01= 
     str02=String02 
     str03=str03 
     str04=tr0 
     str05=abcde 
     str06=bcd 
     str07=abcde 
     str08=bcd
     str09=字符编码
     str10=字符编码
     str11=字符编码
     str12=字符编码
     str13=字符编码
     str14=StringBuffer
     str15=StringBuilder
    复制代码

    3. String 将各种对象转换成String的API

    源码如下(StringValueTest.java):

    复制代码
     1 /**
     2  * String value相关示例
     3  *
     4  * @author skywang
     5  */
     6 import java.util.HashMap;
     7 
     8 public class StringValueTest {
     9     
    10     public static void main(String[] args) {
    11         testValueAPIs() ;
    12     }
    13 
    14     /**
    15      * String 的valueOf()演示程序
    16      */
    17     private static void testValueAPIs() {
    18         System.out.println("-------------------------------- testValueAPIs --------------------------------");
    19         // 1. String    valueOf(Object obj)
    20         //  实际上,返回的是obj.toString();
    21         HashMap map = new HashMap();
    22         map.put("1", "one");
    23         map.put("2", "two");
    24         map.put("3", "three");
    25         System.out.printf("%-50s = %s
    ", "String.valueOf(map)", String.valueOf(map));
    26 
    27         // 2.String    valueOf(boolean b)
    28         System.out.printf("%-50s = %s
    ", "String.valueOf(true)", String.valueOf(true));
    29 
    30         // 3.String    valueOf(char c)
    31         System.out.printf("%-50s = %s
    ", "String.valueOf('m')", String.valueOf('m'));
    32 
    33         // 4.String    valueOf(int i)
    34         System.out.printf("%-50s = %s
    ", "String.valueOf(96)", String.valueOf(96));
    35 
    36         // 5.String    valueOf(long l)
    37         System.out.printf("%-50s = %s
    ", "String.valueOf(12345L)", String.valueOf(12345L));
    38 
    39         // 6.String    valueOf(float f)
    40         System.out.printf("%-50s = %s
    ", "String.valueOf(1.414f)", String.valueOf(1.414f));
    41 
    42         // 7.String    valueOf(double d)
    43         System.out.printf("%-50s = %s
    ", "String.valueOf(3.14159d)", String.valueOf(3.14159d));
    44 
    45         // 8.String    valueOf(char[] data)
    46         System.out.printf("%-50s = %s
    ", "String.valueOf(new char[]{'s','k','y'})", String.valueOf(new char[]{'s','k','y'}));
    47 
    48         // 9.String    valueOf(char[] data, int offset, int count)
    49         System.out.printf("%-50s = %s
    ", "String.valueOf(new char[]{'s','k','y'}, 0, 2)", String.valueOf(new char[]{'s','k','y'}, 0, 2));
    50 
    51         System.out.println();
    52     }
    53 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testValueAPIs --------------------------------
    String.valueOf(map)                                = {3=three, 2=two, 1=one}
    String.valueOf(true)                               = true
    String.valueOf('m')                                = m
    String.valueOf(96)                                 = 96
    String.valueOf(12345L)                             = 12345
    String.valueOf(1.414f)                             = 1.414
    String.valueOf(3.14159d)                           = 3.14159
    String.valueOf(new char[]{'s','k','y'})            = sky
    String.valueOf(new char[]{'s','k','y'}, 0, 2)      = sk
    复制代码

    4. String 中index相关的API

    源码如下(StringIndexTest.java):

    复制代码
     1 /**
     2  * String 中index相关API演示
     3  *
     4  * @author skywang
     5  */
     6 
     7 public class StringIndexTest {
     8 
     9     public static void main(String[] args) {
    10         testIndexAPIs() ;
    11     }
    12 
    13     /**
    14      * String 中index相关API演示
    15      */
    16     private static void testIndexAPIs() {
    17         System.out.println("-------------------------------- testIndexAPIs --------------------------------");
    18 
    19         String istr = "abcAbcABCabCaBcAbCaBCabc";
    20         System.out.printf("istr=%s
    ", istr);
    21 
    22         // 1. 从前往后,找出‘a’第一次出现的位置
    23         System.out.printf("%-30s = %d
    ", "istr.indexOf((int)'a')", istr.indexOf((int)'a'));
    24 
    25         // 2. 从位置5开始,从前往后,找出‘a’第一次出现的位置
    26         System.out.printf("%-30s = %d
    ", "istr.indexOf((int)'a', 5)", istr.indexOf((int)'a', 5));
    27 
    28         // 3. 从后往前,找出‘a’第一次出现的位置
    29         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf((int)'a')", istr.lastIndexOf((int)'a'));
    30 
    31         // 4. 从位置10开始,从后往前,找出‘a’第一次出现的位置
    32         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf((int)'a', 10)", istr.lastIndexOf((int)'a', 10));
    33 
    34 
    35         // 5. 从前往后,找出"bc"第一次出现的位置
    36         System.out.printf("%-30s = %d
    ", "istr.indexOf("bc")", istr.indexOf("bc"));
    37 
    38         // 6. 从位置5开始,从前往后,找出"bc"第一次出现的位置
    39         System.out.printf("%-30s = %d
    ", "istr.indexOf("bc", 5)", istr.indexOf("bc", 5));
    40 
    41         // 7. 从后往前,找出"bc"第一次出现的位置
    42         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf("bc")", istr.lastIndexOf("bc"));
    43 
    44         // 8. 从位置4开始,从后往前,找出"bc"第一次出现的位置
    45         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf("bc", 4)", istr.lastIndexOf("bc", 4));
    46 
    47         System.out.println();
    48     }
    49 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testIndexAPIs --------------------------------
    istr=abcAbcABCabCaBcAbCaBCabc
    istr.indexOf((int)'a')         = 0
    istr.indexOf((int)'a', 5)      = 9
    istr.lastIndexOf((int)'a')     = 21
    istr.lastIndexOf((int)'a', 10) = 9
    istr.indexOf("bc")             = 1
    istr.indexOf("bc", 5)          = 22
    istr.lastIndexOf("bc")         = 22
    istr.lastIndexOf("bc", 4)      = 4
    复制代码

    5. String “比较”操作的API

    源码如下(StringCompareTest.java):

    复制代码
     1 /**
     2  * String 中比较相关API演示
     3  *
     4  * @author skywang
     5  */
     6 
     7 public class StringCompareTest {
     8 
     9     public static void main(String[] args) {
    10         testCompareAPIs() ;
    11     }
    12 
    13     /**
    14      * String 中比较相关API演示
    15      */
    16     private static void testCompareAPIs() {
    17         System.out.println("-------------------------------- testCompareAPIs ------------------------------");
    18 
    19         //String str = "abcdefghijklmnopqrstuvwxyz";
    20         String str = "abcAbcABCabCAbCabc";
    21         System.out.printf("str=%s
    ", str);
    22 
    23         // 1. 比较“2个String是否相等”
    24         System.out.printf("%-50s = %b
    ", 
    25                 "str.equals("abcAbcABCabCAbCabc")", 
    26                 str.equals("abcAbcABCabCAbCabc"));
    27 
    28         // 2. 比较“2个String是否相等(忽略大小写)”
    29         System.out.printf("%-50s = %b
    ", 
    30                 "str.equalsIgnoreCase("ABCABCABCABCABCABC")", 
    31                 str.equalsIgnoreCase("ABCABCABCABCABCABC"));
    32 
    33         // 3. 比较“2个String的大小”
    34         System.out.printf("%-40s = %d
    ", "str.compareTo("abce")", str.compareTo("abce"));
    35 
    36         // 4. 比较“2个String的大小(忽略大小写)”
    37         System.out.printf("%-40s = %d
    ", "str.compareToIgnoreCase("ABC")", str.compareToIgnoreCase("ABC"));
    38 
    39         // 5. 字符串的开头是不是"ab"
    40         System.out.printf("%-40s = %b
    ", "str.startsWith("ab")", str.startsWith("ab"));
    41 
    42         // 6. 字符串的从位置3开头是不是"ab"
    43         System.out.printf("%-40s = %b
    ", "str.startsWith("Ab")", str.startsWith("Ab", 3));
    44 
    45         // 7. 字符串的结尾是不是"bc"
    46         System.out.printf("%-40s = %b
    ", "str.endsWith("bc")", str.endsWith("bc"));
    47 
    48         // 8. 字符串的是不是包含"ABC"
    49         System.out.printf("%-40s = %b
    ", "str.contains("ABC")", str.contains("ABC"));
    50 
    51         // 9. 比较2个字符串的部分内容
    52         String region1 = str.substring(2, str.length());    // 获取str位置3(包括)到末尾(不包括)的子字符串
    53         // 将“str中从位置2开始的字符串”和“region1中位置0开始的字符串”进行比较,比较长度是5。
    54         System.out.printf("regionMatches(%s) = %b
    ", region1, 
    55                 str.regionMatches(2, region1, 0, 5));
    56 
    57         // 10. 比较2个字符串的部分内容(忽略大小写)
    58         String region2 = region1.toUpperCase();    // 将region1转换为大写
    59         String region3 = region1.toLowerCase();    // 将region1转换为小写
    60         System.out.printf("regionMatches(%s) = %b
    ", region2, 
    61                 str.regionMatches(2, region2, 0, 5));
    62         System.out.printf("regionMatches(%s) = %b
    ", region3, 
    63                 str.regionMatches(2, region3, 0, 5));
    64 
    65         // 11. 比较“String”和“StringBuffer”的内容是否相等
    66         System.out.printf("%-60s = %b
    ", 
    67                 "str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc"))", 
    68                 str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc")));
    69 
    70         // 12. 比较“String”和“StringBuilder”的内容是否相等
    71         System.out.printf("%-60s = %b
    ", 
    72                 "str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc"))", 
    73                 str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc")));
    74 
    75         // 13. match()测试程序
    76         // 正则表达式 xxx.xxx.xxx.xxx,其中xxx中x的取值可以是0~9,xxx中有1~3位。
    77         String reg_ipv4 = "[0-9]{3}(\.[0-9]{1,3}){3}";    
    78 
    79         String ipv4addr1 = "192.168.1.102";
    80         String ipv4addr2 = "192.168";
    81         System.out.printf("%-40s = %b
    ", "ipv4addr1.matches()", ipv4addr1.matches(reg_ipv4));
    82         System.out.printf("%-40s = %b
    ", "ipv4addr2.matches()", ipv4addr2.matches(reg_ipv4));
    83 
    84         System.out.println();
    85     }
    86 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testCompareAPIs ------------------------------
    str=abcAbcABCabCAbCabc
    str.equals("abcAbcABCabCAbCabc")                   = true
    str.equalsIgnoreCase("ABCABCABCABCABCABC")         = true
    str.compareTo("abce")                    = -36
    str.compareToIgnoreCase("ABC")           = 15
    str.startsWith("ab")                     = true
    str.startsWith("Ab")                     = true
    str.endsWith("bc")                       = true
    str.contains("ABC")                      = true
    regionMatches(cAbcABCabCAbCabc) = true
    regionMatches(CABCABCABCABCABC) = false
    regionMatches(cabcabcabcabcabc) = false
    str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc"))    = true
    str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc"))   = true
    ipv4addr1.matches()                      = true
    ipv4addr2.matches()                      = false
    复制代码

    6. String “修改(追加/替换/截取/分割)”操作的API

    源码如下(StringModifyTest.java):

    复制代码
     1 /**
     2  * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
     3  *
     4  * @author skywang
     5  */
     6 
     7 public class StringModifyTest {
     8     
     9     public static void main(String[] args) {
    10         testModifyAPIs() ;
    11     }
    12 
    13     /**
    14      * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
    15      */
    16     private static void testModifyAPIs() {
    17         System.out.println("-------------------------------- testModifyAPIs -------------------------------");
    18 
    19         String str = " abcAbcABCabCAbCabc ";
    20         System.out.printf("str=%s, len=%d
    ", str, str.length());
    21 
    22         // 1.追加
    23         // 将"123"追加到str之后
    24         System.out.printf("%-30s = %s
    ", "str.concat("123")", 
    25                 str.concat("123"));
    26 
    27         // 2.截取
    28         // 截取str中从位置7(包括)开始的元素。
    29         System.out.printf("%-30s = %s
    ", "str.substring(7)", str.substring(7));
    30         // 截取str中从位置7(包括)到位置10(不包括)之间的元素。
    31         System.out.printf("%-30s = %s
    ", "str.substring(7, 10)", str.substring(7, 10));
    32         // 删除str中首位的空格,并返回。
    33         System.out.printf("%-30s = %s, len=%d
    ", "str.trim()", str.trim(), str.trim().length());
    34 
    35         // 3.替换
    36         // 将str中的 “字符‘a’” 全部替换为 “字符‘_’”
    37         System.out.printf("%-30s = %s
    ", "str.replace('a', 'M')", str.replace('a', '_'));
    38         // 将str中的第一次出现的“字符串“a”” 替换为 “字符串“###””
    39         System.out.printf("%-30s = %s
    ", "str.replaceFirst("a", "###")", str.replaceFirst("a", "###"));
    40         // 将str中的 “字符串“a”” 全部替换为 “字符串“$$$””
    41         System.out.printf("%-30s = %s
    ", "str.replace("a", "$$$")", str.replace("a", "$$$"));
    42 
    43         // 4.分割
    44         // 以“b”作为分隔符,对str进行分割
    45         String[] splits = str.split("b");
    46         for (int i=0; i<splits.length; i++) {
    47             System.out.printf("splits[%d]=%s
    ", i, splits[i]);
    48         }
    49 
    50         System.out.println();
    51     }
    52 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testModifyAPIs -------------------------------
    str= abcAbcABCabCAbCabc , len=20
    str.concat("123")              =  abcAbcABCabCAbCabc 123
    str.substring(7)               = ABCabCAbCabc 
    str.substring(7, 10)           = ABC
    str.trim()                     = abcAbcABCabCAbCabc, len=18
    str.replace('a', 'M')          =  _bcAbcABC_bCAbC_bc 
    str.replaceFirst("a", "###")   =  ###bcAbcABCabCAbCabc 
    str.replace("a", "$$$")        =  $$$bcAbcABC$$$bCAbC$$$bc 
    splits[0]= a
    splits[1]=cA
    splits[2]=cABCa
    splits[3]=CA
    splits[4]=Ca
    splits[5]=c 
    复制代码

    7. String 操作Unicode的API

    源码如下(StringUnicodeTest.java):

    复制代码
     1 /**
     2  * String 中与unicode相关的API
     3  *
     4  * @author skywang
     5  */
     6 
     7 public class StringUnicodeTest {
     8     
     9     public static void main(String[] args) {
    10         testUnicodeAPIs() ;
    11     }
    12 
    13     /**
    14      * String 中与unicode相关的API
    15      */
    16     private static void testUnicodeAPIs() {
    17         System.out.println("-------------------------------- testUnicodeAPIs ------------------------------");
    18 
    19         String ustr = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4);  // "字符编码"(u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
    20         System.out.printf("ustr=%s
    ", ustr);
    21 
    22         //  获取位置0的元素对应的unciode编码
    23         System.out.printf("%-30s = 0x%x
    ", "ustr.codePointAt(0)", ustr.codePointAt(0));
    24 
    25         // 获取位置2之前的元素对应的unciode编码
    26         System.out.printf("%-30s = 0x%x
    ", "ustr.codePointBefore(2)", ustr.codePointBefore(2));
    27 
    28         // 获取位置1开始偏移2个代码点的索引
    29         System.out.printf("%-30s = %d
    ", "ustr.offsetByCodePoints(1, 2)", ustr.offsetByCodePoints(1, 2));
    30 
    31         // 获取第0~3个元素之间的unciode编码的个数
    32         System.out.printf("%-30s = %d
    ", "ustr.codePointCount(0, 3)", ustr.codePointCount(0, 3));
    33 
    34         System.out.println();
    35     }
    36 }
    复制代码

    运行结果

    -------------------------------- testUnicodeAPIs ------------------------------
    ustr=字符编码
    ustr.codePointAt(0)            = 0x5b57
    ustr.codePointBefore(2)        = 0x7b26
    ustr.offsetByCodePoints(1, 2)  = 3
    ustr.codePointCount(0, 3)      = 3

    8. String 剩余的API

    源码如下(StringOtherTest.java):

    复制代码
     1 /**
     2  * String 中其它的API
     3  *
     4  * @author skywang
     5  */
     6 
     7 public class StringOtherTest {
     8     
     9     public static void main(String[] args) {
    10         testOtherAPIs() ;
    11     }
    12 
    13     /**
    14      * String 中其它的API
    15      */
    16     private static void testOtherAPIs() {
    17         System.out.println("-------------------------------- testOtherAPIs --------------------------------");
    18 
    19         String str = "0123456789";
    20         System.out.printf("str=%s
    ", str);
    21 
    22         // 1. 字符串长度
    23         System.out.printf("%s = %d
    ", "str.length()", str.length());
    24 
    25         // 2. 字符串是否为空
    26         System.out.printf("%s = %b
    ", "str.isEmpty()", str.isEmpty());
    27 
    28         // 3. [字节] 获取字符串对应的字节数组
    29         byte[] barr = str.getBytes();
    30         for (int i=0; i<barr.length; i++) {
    31                System.out.printf("barr[%d]=0x%x ", i, barr[i]);
    32         }
    33         System.out.println();
    34 
    35         // 4. [字符] 获取字符串位置4的字符
    36         System.out.printf("%s = %c
    ", "str.charAt(4)", str.charAt(4));
    37 
    38         // 5. [字符] 获取字符串对应的字符数组
    39         char[] carr = str.toCharArray();
    40         for (int i=0; i<carr.length; i++) {
    41                System.out.printf("carr[%d]=%c ", i, carr[i]);
    42         }
    43         System.out.println();
    44 
    45         // 6. [字符] 获取字符串中部分元素对应的字符数组
    46         char[] carr2 = new char[3];
    47         str.getChars(6, 9, carr2, 0);
    48         for (int i=0; i<carr2.length; i++) {
    49                System.out.printf("carr2[%d]=%c ", i, carr2[i]);
    50         }
    51         System.out.println();
    52 
    53         // 7. [字符] 获取字符数组对应的字符串
    54         System.out.printf("%s = %s
    ", 
    55                 "str.copyValueOf(new char[]{'a','b','c','d','e'})", 
    56                 String.copyValueOf(new char[]{'a','b','c','d','e'}));
    57 
    58         // 8. [字符] 获取字符数组中部分元素对应的字符串
    59         System.out.printf("%s = %s
    ", 
    60                 "str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4)", 
    61                 String.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4));
    62 
    63         // 9. format()示例,将对象数组按指定格式转换为字符串
    64         System.out.printf("%s = %s
    ", 
    65                 "str.format()", 
    66                 String.format("%s-%d-%b", "abc", 3, true));
    67 
    68         System.out.println();
    69     }
    70 }
    复制代码

    运行结果

    复制代码
    -------------------------------- testOtherAPIs --------------------------------
    str=0123456789
    str.length() = 10
    str.isEmpty() = false
    barr[0]=0x30 barr[1]=0x31 barr[2]=0x32 barr[3]=0x33 barr[4]=0x34 barr[5]=0x35 barr[6]=0x36 barr[7]=0x37 barr[8]=0x38 barr[9]=0x39 
    str.charAt(4) = 4
    carr[0]=0 carr[1]=1 carr[2]=2 carr[3]=3 carr[4]=4 carr[5]=5 carr[6]=6 carr[7]=7 carr[8]=8 carr[9]=9 
    carr2[0]=6 carr2[1]=7 carr2[2]=8 
    str.copyValueOf(new char[]{'a','b','c','d','e'}) = abcde
    str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4) = bcde
    str.format() = abc-3-true
    复制代码

    9. String 完整示例

    下面的示例是整合上面的几个示例的完整的String演示程序,源码如下(StringAPITest.java):

      1 /**
      2  * String 演示程序
      3  *
      4  * @author skywang
      5  */
      6 import java.util.HashMap;
      7 import java.nio.charset.Charset;
      8 import java.io.UnsupportedEncodingException;
      9 
     10 public class StringAPITest {
     11     
     12     public static void main(String[] args) {
     13         testStringConstructors() ; // String 构造函数测试程序
     14         testValueAPIs() ;          // String 的valueOf()演示程序
     15         testIndexAPIs() ;          // String 中index相关API演示
     16         testCompareAPIs() ;        // String 中比较相关API演示
     17         testModifyAPIs() ;         // String 中 修改(追加/替换/截取/分割)字符串的相关API演示
     18         testUnicodeAPIs() ;        // String 中与unicode相关的API
     19         testOtherAPIs() ;          // String 中其它的API
     20     }
     21 
     22     /**
     23      * String 构造函数测试程序
     24      */
     25     private static void testStringConstructors() {
     26         try {
     27             System.out.println("-------------------------------- testStringConstructors -----------------------");
     28 
     29             String str01 = new String();
     30             String str02 = new String("String02");
     31             String str03 = new String(new char[]{'s','t','r','0','3'});
     32             String str04 = new String(new char[]{'s','t','r','0','4'}, 1, 3);          // 1表示起始位置,3表示个数
     33             String str05 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65});       // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
     34             String str06 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 1, 3); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
     35             String str07 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0);       // 0x61在ASC表中,对应字符"a";0,表示“高字节”
     36             String str08 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0, 1, 3); // 0x61在ASC表中,对应字符"a"; 0,表示“高字节”;1表示起始位置,3表示长度
     37             String str09 = new String(new byte[]{(byte)0xe5, (byte)0xad, (byte)0x97, /* 字-对应的utf-8编码 */ 
     38                                                  (byte)0xe7, (byte)0xac, (byte)0xa6, /* 符-对应的utf-8编码 */ 
     39                                                  (byte)0xe7, (byte)0xbc, (byte)0x96, /* 编-对应的utf-8编码 */ 
     40                                                  (byte)0xe7, (byte)0xa0, (byte)0x81, /* 码-对应的utf-8编码 */ }, 
     41                                       0, 12, "utf-8");  // 0表示起始位置,12表示长度。
     42             String str10 = new String(new byte[]{(byte)0x5b, (byte)0x57, /* 字-对应的utf-16编码 */ 
     43                                                  (byte)0x7b, (byte)0x26, /* 符-对应的utf-16编码 */ 
     44                                                  (byte)0x7f, (byte)0x16, /* 编-对应的utf-16编码 */ 
     45                                                  (byte)0x78, (byte)0x01, /* 码-对应的utf-16编码 */ }, 
     46                                       0, 8, "utf-16");  // 0表示起始位置,8表示长度。
     47             String str11 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gb2312编码  */ 
     48                                                  (byte)0xb7, (byte)0xfb, /* 符-对应的gb2312编码 */ 
     49                                                  (byte)0xb1, (byte)0xe0, /* 编-对应的gb2312编码 */ 
     50                                                  (byte)0xc2, (byte)0xeb, /* 码-对应的gb2312编码 */ }, 
     51                                       Charset.forName("gb2312")); 
     52             String str12 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gbk编码 */ 
     53                                                  (byte)0xb7, (byte)0xfb, /* 符-对应的gbk编码 */ 
     54                                                  (byte)0xb1, (byte)0xe0, /* 编-对应的gbk编码 */ 
     55                                                  (byte)0xc2, (byte)0xeb, /* 码-对应的gbk编码 */ }, 
     56                                       0, 8, Charset.forName("gbk")); 
     57             String str13 = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4);  // "字符编码"(u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
     58             String str14 = new String(new StringBuffer("StringBuffer"));
     59             String str15 = new String(new StringBuilder("StringBuilder"));
     60 
     61             System.out.printf(" str01=%s 
     str02=%s 
     str03=%s 
     str04=%s 
     str05=%s 
     str06=%s 
     str07=%s 
     str08=%s
     str09=%s
     str10=%s
     str11=%s
     str12=%s
     str13=%s
     str14=%s
     str15=%s
    ",
     62                     str01, str02, str03, str04, str05, str06, str07, str08, str09, str10, str11, str12, str13, str14, str15);
     63 
     64 
     65             System.out.println();
     66         } catch (UnsupportedEncodingException e) {
     67             e.printStackTrace();
     68         }
     69     }
     70 
     71     /**
     72      * String 中其它的API
     73      */
     74     private static void testOtherAPIs() {
     75         System.out.println("-------------------------------- testOtherAPIs --------------------------------");
     76 
     77         String str = "0123456789";
     78         System.out.printf("str=%s
    ", str);
     79 
     80         // 1. 字符串长度
     81         System.out.printf("%s = %d
    ", "str.length()", str.length());
     82 
     83         // 2. 字符串是否为空
     84         System.out.printf("%s = %b
    ", "str.isEmpty()", str.isEmpty());
     85 
     86         // 3. [字节] 获取字符串对应的字节数组
     87         byte[] barr = str.getBytes();
     88         for (int i=0; i<barr.length; i++) {
     89                System.out.printf("barr[%d]=0x%x ", i, barr[i]);
     90         }
     91         System.out.println();
     92 
     93         // 4. [字符] 获取字符串位置4的字符
     94         System.out.printf("%s = %c
    ", "str.charAt(4)", str.charAt(4));
     95 
     96         // 5. [字符] 获取字符串对应的字符数组
     97         char[] carr = str.toCharArray();
     98         for (int i=0; i<carr.length; i++) {
     99                System.out.printf("carr[%d]=%c ", i, carr[i]);
    100         }
    101         System.out.println();
    102 
    103         // 6. [字符] 获取字符串中部分元素对应的字符数组
    104         char[] carr2 = new char[3];
    105         str.getChars(6, 9, carr2, 0);
    106         for (int i=0; i<carr2.length; i++) {
    107                System.out.printf("carr2[%d]=%c ", i, carr2[i]);
    108         }
    109         System.out.println();
    110 
    111         // 7. [字符] 获取字符数组对应的字符串
    112         System.out.printf("%s = %s
    ", 
    113                 "str.copyValueOf(new char[]{'a','b','c','d','e'})", 
    114                 String.copyValueOf(new char[]{'a','b','c','d','e'}));
    115 
    116         // 8. [字符] 获取字符数组中部分元素对应的字符串
    117         System.out.printf("%s = %s
    ", 
    118                 "str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4)", 
    119                 String.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4));
    120 
    121         // 9. format()示例,将对象数组按指定格式转换为字符串
    122         System.out.printf("%s = %s
    ", 
    123                 "str.format()", 
    124                 String.format("%s-%d-%b", "abc", 3, true));
    125 
    126         System.out.println();
    127     }
    128 
    129     /**
    130      * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
    131      */
    132     private static void testModifyAPIs() {
    133         System.out.println("-------------------------------- testModifyAPIs -------------------------------");
    134 
    135         String str = " abcAbcABCabCAbCabc ";
    136         System.out.printf("%s, len=%d
    ", str, str.length());
    137 
    138         // 1.追加
    139         // 将"123"追加到str之后
    140         System.out.printf("%-30s = %s
    ", "str.concat("123")", 
    141                 str.concat("123"));
    142 
    143         // 2.截取
    144         // 截取str中从位置7(包括)开始的元素。
    145         System.out.printf("%-30s = %s
    ", "str.substring(7)", str.substring(7));
    146         // 截取str中从位置7(包括)到位置10(不包括)之间的元素。
    147         System.out.printf("%-30s = %s
    ", "str.substring(7, 10)", str.substring(7, 10));
    148         // 删除str中首位的空格,并返回。
    149         System.out.printf("%-30s = %s, len=%d
    ", "str.trim()", str.trim(), str.trim().length());
    150 
    151         // 3.替换
    152         // 将str中的 “字符‘a’” 全部替换为 “字符‘_’”
    153         System.out.printf("%-30s = %s
    ", "str.replace('a', 'M')", str.replace('a', '_'));
    154         // 将str中的第一次出现的“字符串“a”” 替换为 “字符串“###””
    155         System.out.printf("%-30s = %s
    ", "str.replaceFirst("a", "###")", str.replaceFirst("a", "###"));
    156         // 将str中的 “字符串“a”” 全部替换为 “字符串“$$$””
    157         System.out.printf("%-30s = %s
    ", "str.replace("a", "$$$")", str.replace("a", "$$$"));
    158 
    159         // 4.分割
    160         // 以“b”作为分隔符,对str进行分割
    161         String[] splits = str.split("b");
    162         for (int i=0; i<splits.length; i++) {
    163             System.out.printf("splits[%d]=%s
    ", i, splits[i]);
    164         }
    165 
    166         System.out.println();
    167     }
    168 
    169 
    170     /**
    171      * String 中比较相关API演示
    172      */
    173     private static void testCompareAPIs() {
    174         System.out.println("-------------------------------- testCompareAPIs ------------------------------");
    175 
    176         //String str = "abcdefghijklmnopqrstuvwxyz";
    177         String str = "abcAbcABCabCAbCabc";
    178         System.out.printf("%s
    ", str);
    179 
    180         // 1. 比较“2个String是否相等”
    181         System.out.printf("%-50s = %b
    ", 
    182                 "str.equals("abcAbcABCabCAbCabc")", 
    183                 str.equals("abcAbcABCabCAbCabc"));
    184 
    185         // 2. 比较“2个String是否相等(忽略大小写)”
    186         System.out.printf("%-50s = %b
    ", 
    187                 "str.equalsIgnoreCase("ABCABCABCABCABCABC")", 
    188                 str.equalsIgnoreCase("ABCABCABCABCABCABC"));
    189 
    190         // 3. 比较“2个String的大小”
    191         System.out.printf("%-40s = %d
    ", "str.compareTo("abce")", str.compareTo("abce"));
    192 
    193         // 4. 比较“2个String的大小(忽略大小写)”
    194         System.out.printf("%-40s = %d
    ", "str.compareToIgnoreCase("ABC")", str.compareToIgnoreCase("ABC"));
    195 
    196         // 5. 字符串的开头是不是"ab"
    197         System.out.printf("%-40s = %b
    ", "str.startsWith("ab")", str.startsWith("ab"));
    198 
    199         // 6. 字符串的从位置3开头是不是"ab"
    200         System.out.printf("%-40s = %b
    ", "str.startsWith("Ab")", str.startsWith("Ab", 3));
    201 
    202         // 7. 字符串的结尾是不是"bc"
    203         System.out.printf("%-40s = %b
    ", "str.endsWith("bc")", str.endsWith("bc"));
    204 
    205         // 8. 字符串的是不是包含"ABC"
    206         System.out.printf("%-40s = %b
    ", "str.contains("ABC")", str.contains("ABC"));
    207 
    208         // 9. 比较2个字符串的部分内容
    209         String region1 = str.substring(2, str.length());    // 获取str位置3(包括)到末尾(不包括)的子字符串
    210         // 将“str中从位置2开始的字符串”和“region1中位置0开始的字符串”进行比较,比较长度是5。
    211         System.out.printf("regionMatches(%s) = %b
    ", region1, 
    212                 str.regionMatches(2, region1, 0, 5));
    213 
    214         // 10. 比较2个字符串的部分内容(忽略大小写)
    215         String region2 = region1.toUpperCase();    // 将region1转换为大写
    216         String region3 = region1.toLowerCase();    // 将region1转换为小写
    217         System.out.printf("regionMatches(%s) = %b
    ", region2, 
    218                 str.regionMatches(2, region2, 0, 5));
    219         System.out.printf("regionMatches(%s) = %b
    ", region3, 
    220                 str.regionMatches(2, region3, 0, 5));
    221 
    222         // 11. 比较“String”和“StringBuffer”的内容是否相等
    223         System.out.printf("%-60s = %b
    ", 
    224                 "str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc"))", 
    225                 str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc")));
    226 
    227         // 12. 比较“String”和“StringBuilder”的内容是否相等
    228         System.out.printf("%-60s = %b
    ", 
    229                 "str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc"))", 
    230                 str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc")));
    231 
    232         // 13. match()测试程序
    233         // 正则表达式 xxx.xxx.xxx.xxx,其中xxx中x的取值可以是0~9,xxx中有1~3位。
    234         String reg_ipv4 = "[0-9]{3}(\.[0-9]{1,3}){3}";    
    235 
    236         String ipv4addr1 = "192.168.1.102";
    237         String ipv4addr2 = "192.168";
    238         System.out.printf("%-40s = %b
    ", "ipv4addr1.matches()", ipv4addr1.matches(reg_ipv4));
    239         System.out.printf("%-40s = %b
    ", "ipv4addr2.matches()", ipv4addr2.matches(reg_ipv4));
    240 
    241         System.out.println();
    242     }
    243 
    244     /**
    245      * String 的valueOf()演示程序
    246      */
    247     private static void testValueAPIs() {
    248         System.out.println("-------------------------------- testValueAPIs --------------------------------");
    249         // 1. String    valueOf(Object obj)
    250         //  实际上,返回的是obj.toString();
    251         HashMap map = new HashMap();
    252         map.put("1", "one");
    253         map.put("2", "two");
    254         map.put("3", "three");
    255         System.out.printf("%-50s = %s
    ", "String.valueOf(map)", String.valueOf(map));
    256 
    257         // 2.String    valueOf(boolean b)
    258         System.out.printf("%-50s = %s
    ", "String.valueOf(true)", String.valueOf(true));
    259 
    260         // 3.String    valueOf(char c)
    261         System.out.printf("%-50s = %s
    ", "String.valueOf('m')", String.valueOf('m'));
    262 
    263         // 4.String    valueOf(int i)
    264         System.out.printf("%-50s = %s
    ", "String.valueOf(96)", String.valueOf(96));
    265 
    266         // 5.String    valueOf(long l)
    267         System.out.printf("%-50s = %s
    ", "String.valueOf(12345L)", String.valueOf(12345L));
    268 
    269         // 6.String    valueOf(float f)
    270         System.out.printf("%-50s = %s
    ", "String.valueOf(1.414f)", String.valueOf(1.414f));
    271 
    272         // 7.String    valueOf(double d)
    273         System.out.printf("%-50s = %s
    ", "String.valueOf(3.14159d)", String.valueOf(3.14159d));
    274 
    275         // 8.String    valueOf(char[] data)
    276         System.out.printf("%-50s = %s
    ", "String.valueOf(new char[]{'s','k','y'})", String.valueOf(new char[]{'s','k','y'}));
    277 
    278         // 9.String    valueOf(char[] data, int offset, int count)
    279         System.out.printf("%-50s = %s
    ", "String.valueOf(new char[]{'s','k','y'}, 0, 2)", String.valueOf(new char[]{'s','k','y'}, 0, 2));
    280 
    281         System.out.println();
    282     }
    283 
    284     /**
    285      * String 中index相关API演示
    286      */
    287     private static void testIndexAPIs() {
    288         System.out.println("-------------------------------- testIndexAPIs --------------------------------");
    289 
    290         String istr = "abcAbcABCabCaBcAbCaBCabc";
    291         System.out.printf("istr=%s
    ", istr);
    292 
    293         // 1. 从前往后,找出‘a’第一次出现的位置
    294         System.out.printf("%-30s = %d
    ", "istr.indexOf((int)'a')", istr.indexOf((int)'a'));
    295 
    296         // 2. 从位置5开始,从前往后,找出‘a’第一次出现的位置
    297         System.out.printf("%-30s = %d
    ", "istr.indexOf((int)'a', 5)", istr.indexOf((int)'a', 5));
    298 
    299         // 3. 从后往前,找出‘a’第一次出现的位置
    300         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf((int)'a')", istr.lastIndexOf((int)'a'));
    301 
    302         // 4. 从位置10开始,从后往前,找出‘a’第一次出现的位置
    303         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf((int)'a', 10)", istr.lastIndexOf((int)'a', 10));
    304 
    305 
    306         // 5. 从前往后,找出"bc"第一次出现的位置
    307         System.out.printf("%-30s = %d
    ", "istr.indexOf("bc")", istr.indexOf("bc"));
    308 
    309         // 6. 从位置5开始,从前往后,找出"bc"第一次出现的位置
    310         System.out.printf("%-30s = %d
    ", "istr.indexOf("bc", 5)", istr.indexOf("bc", 5));
    311 
    312         // 7. 从后往前,找出"bc"第一次出现的位置
    313         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf("bc")", istr.lastIndexOf("bc"));
    314 
    315         // 8. 从位置4开始,从后往前,找出"bc"第一次出现的位置
    316         System.out.printf("%-30s = %d
    ", "istr.lastIndexOf("bc", 4)", istr.lastIndexOf("bc", 4));
    317 
    318         System.out.println();
    319     }
    320 
    321     /**
    322      * String 中与unicode相关的API
    323      */
    324     private static void testUnicodeAPIs() {
    325         System.out.println("-------------------------------- testUnicodeAPIs ------------------------------");
    326 
    327         String ustr = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4);  // "字符编码"(u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
    328         System.out.printf("ustr=%s
    ", ustr);
    329 
    330         //  获取位置0的元素对应的unciode编码
    331         System.out.printf("%-30s = 0x%x
    ", "ustr.codePointAt(0)", ustr.codePointAt(0));
    332 
    333         // 获取位置2之前的元素对应的unciode编码
    334         System.out.printf("%-30s = 0x%x
    ", "ustr.codePointBefore(2)", ustr.codePointBefore(2));
    335 
    336         // 获取位置1开始的元素对应的unciode编码
    337         System.out.printf("%-30s = %d
    ", "ustr.offsetByCodePoints(1, 2)", ustr.offsetByCodePoints(1, 2));
    338 
    339         // 获取第0~3个元素之间的unciode编码的个数
    340         System.out.printf("%-30s = %d
    ", "ustr.codePointCount(0, 3)", ustr.codePointCount(0, 3));
    341 
    342         System.out.println();
    343     }
    344 }
    View Code

     

  • 相关阅读:
    制定并分享愿景 领导的艺术之一
    不要非黑即白,有些数据即使只有90%的准确,也是有用的
    双赢的思维考虑问题
    利用一切机会丰富自己的知识,利用一切机会调整自己的行为,为了达成目标而与他人合作,取得共赢 update by June 2012
    数据说话 说服别人
    对重要的事情,要很快做出反应
    You can if you think you can
    宽容的心态,开明的头脑
    DataGridView上下移动行及设置当前行
    sql 数据库、表
  • 原文地址:https://www.cnblogs.com/jpfss/p/10414045.html
Copyright © 2020-2023  润新知